Re: Запросы проходят мимо кеша

Danila Shtan danila at shtan.ru
Fri Jan 18 16:17:02 UTC 2013


У нас подобная схема реализованна именно через proxy_cache_bypass
$cookie_session; proxy_no_cache $cookie_session;
Я, правда, в содержимое переменной не заглядывал — не уверен, что именно
там должно быть.

Работает как планировалось — при наличии куки не кэширует, при отсутствии
(анонимные пользователи) — кэширует.

Д.


2013/1/18 Serafim <nginx-forum at nginx.us>

> Добрый день.
>
> Задача: отдавать ответ из кеша для всех запросов без определенной куки
> (sessionid).
>
> Используются следующих конфиг:
>
> log_format cache "Code: $status Cache key: $cache Cache:
> $upstream_cache_status Response time: $upstream_response_time Uri: $uri";
> proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mainForNonAuth:10m
> inactive=10m max_size=1000m;
>
> map $cookie_sessionid $cache {
>  default "noncache";
>  "" "";
>  "-" "";
> }
>
> server {
>  include includes/listen.conf;
>  server_name domain.ru;
>  client_max_body_size 100m;
>  location / {
>   access_log /var/log/nginx/test.school.lo.ufanet.ru.access.log cache;
>   error_log /var/log/nginx/test.school.lo.ufanet.ru.error.log debug;
>   ### CACHE::begin
>   proxy_cache_bypass $cache;
>   proxy_no_cache $cache;
>   proxy_cache mainForNonAuth;
>   proxy_cache_use_stale updating;
>   proxy_cache_valid 200 10m;
>   proxy_cache_methods GET HEAD;
>   ### CACHE::end
>   proxy_pass http://127.0.0.1;
>   proxy_set_header Host $host;
>   proxy_set_header X-Real-IP $remote_addr;
>   proxy_set_header X-Forwarded-For $remote_addr;
>  }
> }
>
> Далее выполняем запросы (без куки session), в логах видим следующее:
>
> root at test:/etc/nginx/sites-enabled# tail -f
> /var/log/nginx/test.school.lo.ufanet.ru.access.log
> Code: 200 Cache key:  Cache: MISS Response time: 0.953 Uri: /
> Code: 200 Cache key:  Cache: MISS Response time: 0.009 Uri: /
> Code: 200 Cache key:  Cache: MISS Response time: 0.007 Uri: /
> Code: 200 Cache key:  Cache: MISS Response time: 0.008 Uri: /
>
> т.е. как видим в логе значение переменной $cache равно пустой строке, из
> документации следует, что в данному случае (согласно работе директив
> proxy_cache_bypass и proxy_no_cache) ответ должен браться из кеша, но тем
> нее менее запрос уходит на бэк-енд и ответ береться из него.
>
> если же отправить запросы содержащие куку sessionid, но в логе видим
> следующее:
>
> Code: 302 Cache key:  Cache: - Response time: 1.434 Uri: /journal/try-login
> Code: 301 Cache key: noncache Cache: BYPASS Response time: 0.003 Uri: /
> Code: 200 Cache key: noncache Cache: BYPASS Response time: 0.709 Uri: /
> Code: 200 Cache key: noncache Cache: BYPASS Response time: 0.013 Uri: /
>
> 302 редирект как я полагаю по умолчанию не кешируется вообще, поэтому
> статус
> кеша равен "-", а вот остальные запросы работают правильно, т.е.
> срабатывает
> правило BYPASS.
>
> поясню причины использования конструкции map {}, в документации к
> proxy_cache_bypass и proxy_no_cache сказано, что ответ берется из кеша
> только в том случае, если переменная указанная в данных директивах равно
> пустой строке (или нулю), но использовать переменную $cookie_sessionid
> нелья, т.к. nginx (по непонятным для меня причинам) случае отсутствия куки
> возвращает не пустую строку, а символ "-".
>
> пожалуйста подскажите что я делаю не так, и как можно решить мою задачу.
>
> спасибо.
>
> p.s.
>
> nginx version: nginx/1.2.1
> TLS SNI support enabled
> configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf
> --error-log-path=/var/log/nginx/error.log
> --http-client-body-temp-path=/var/lib/nginx/body
> --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
> --http-log-path=/var/log/nginx/access.log
> --http-proxy-temp-path=/var/lib/nginx/proxy
> --http-scgi-temp-path=/var/lib/nginx/scgi
> --http-uwsgi-temp-path=/var/lib/nginx/uwsgi
> --lock-path=/var/lock/nginx.lock
> --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug
> --with-http_addition_module --with-http_dav_module --with-http_geoip_module
> --with-http_gzip_static_module --with-http_image_filter_module
> --with-http_realip_module --with-http_stub_status_module
> --with-http_ssl_module --with-http_sub_module --with-http_xslt_module
> --with-ipv6 --with-sha1=/usr/include/openssl
> --with-md5=/usr/include/openssl
> --with-mail --with-mail_ssl_module
> --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-auth-pam
> --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-echo
> --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-upstream-fair
> --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-dav-ext-module
>
> Posted at Nginx Forum:
> http://forum.nginx.org/read.php?21,235256,235256#msg-235256
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20130118/a2f73bbf/attachment-0001.html>


Подробная информация о списке рассылки nginx-ru