<div dir="ltr">У нас подобная схема реализованна именно через <span style="font-family:arial,sans-serif;font-size:13px">proxy_cache_bypass $cookie_session;</span><span style="font-family:arial,sans-serif;font-size:13px"> proxy_no_cache $cookie_session;</span><div style>
<span style="font-family:arial,sans-serif;font-size:13px">Я, правда, в содержимое переменной не заглядывал — не уверен, что именно там должно быть.</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">Работает как планировалось — при наличии куки не кэширует, при отсутствии (анонимные пользователи) — кэширует.</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">Д.</span></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/1/18 Serafim <span dir="ltr"><<a href="mailto:nginx-forum@nginx.us" target="_blank">nginx-forum@nginx.us</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Добрый день.<br>
<br>
Задача: отдавать ответ из кеша для всех запросов без определенной куки<br>
(sessionid).<br>
<br>
Используются следующих конфиг:<br>
<br>
log_format cache "Code: $status Cache key: $cache Cache:<br>
$upstream_cache_status Response time: $upstream_response_time Uri: $uri";<br>
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mainForNonAuth:10m<br>
inactive=10m max_size=1000m;<br>
<br>
map $cookie_sessionid $cache {<br>
 default "noncache";<br>
 "" "";<br>
 "-" "";<br>
}<br>
<br>
server {<br>
 include includes/listen.conf;<br>
 server_name <a href="http://domain.ru" target="_blank">domain.ru</a>;<br>
 client_max_body_size 100m;<br>
 location / {<br>
  access_log /var/log/nginx/test.school.lo.ufanet.ru.access.log cache;<br>
  error_log /var/log/nginx/test.school.lo.ufanet.ru.error.log debug;<br>
  ### CACHE::begin<br>
  proxy_cache_bypass $cache;<br>
  proxy_no_cache $cache;<br>
  proxy_cache mainForNonAuth;<br>
  proxy_cache_use_stale updating;<br>
  proxy_cache_valid 200 10m;<br>
  proxy_cache_methods GET HEAD;<br>
  ### CACHE::end<br>
  proxy_pass <a href="http://127.0.0.1" target="_blank">http://127.0.0.1</a>;<br>
  proxy_set_header Host $host;<br>
  proxy_set_header X-Real-IP $remote_addr;<br>
  proxy_set_header X-Forwarded-For $remote_addr;<br>
 }<br>
}<br>
<br>
Далее выполняем запросы (без куки session), в логах видим следующее:<br>
<br>
root@test:/etc/nginx/sites-enabled# tail -f<br>
/var/log/nginx/test.school.lo.ufanet.ru.access.log<br>
Code: 200 Cache key:  Cache: MISS Response time: 0.953 Uri: /<br>
Code: 200 Cache key:  Cache: MISS Response time: 0.009 Uri: /<br>
Code: 200 Cache key:  Cache: MISS Response time: 0.007 Uri: /<br>
Code: 200 Cache key:  Cache: MISS Response time: 0.008 Uri: /<br>
<br>
т.е. как видим в логе значение переменной $cache равно пустой строке, из<br>
документации следует, что в данному случае (согласно работе директив<br>
proxy_cache_bypass и proxy_no_cache) ответ должен браться из кеша, но тем<br>
нее менее запрос уходит на бэк-енд и ответ береться из него.<br>
<br>
если же отправить запросы содержащие куку sessionid, но в логе видим<br>
следующее:<br>
<br>
Code: 302 Cache key:  Cache: - Response time: 1.434 Uri: /journal/try-login<br>
Code: 301 Cache key: noncache Cache: BYPASS Response time: 0.003 Uri: /<br>
Code: 200 Cache key: noncache Cache: BYPASS Response time: 0.709 Uri: /<br>
Code: 200 Cache key: noncache Cache: BYPASS Response time: 0.013 Uri: /<br>
<br>
302 редирект как я полагаю по умолчанию не кешируется вообще, поэтому статус<br>
кеша равен "-", а вот остальные запросы работают правильно, т.е. срабатывает<br>
правило BYPASS.<br>
<br>
поясню причины использования конструкции map {}, в документации к<br>
proxy_cache_bypass и proxy_no_cache сказано, что ответ берется из кеша<br>
только в том случае, если переменная указанная в данных директивах равно<br>
пустой строке (или нулю), но использовать переменную $cookie_sessionid<br>
нелья, т.к. nginx (по непонятным для меня причинам) случае отсутствия куки<br>
возвращает не пустую строку, а символ "-".<br>
<br>
пожалуйста подскажите что я делаю не так, и как можно решить мою задачу.<br>
<br>
спасибо.<br>
<br>
p.s.<br>
<br>
nginx version: nginx/1.2.1<br>
TLS SNI support enabled<br>
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf<br>
--error-log-path=/var/log/nginx/error.log<br>
--http-client-body-temp-path=/var/lib/nginx/body<br>
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi<br>
--http-log-path=/var/log/nginx/access.log<br>
--http-proxy-temp-path=/var/lib/nginx/proxy<br>
--http-scgi-temp-path=/var/lib/nginx/scgi<br>
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock<br>
--pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug<br>
--with-http_addition_module --with-http_dav_module --with-http_geoip_module<br>
--with-http_gzip_static_module --with-http_image_filter_module<br>
--with-http_realip_module --with-http_stub_status_module<br>
--with-http_ssl_module --with-http_sub_module --with-http_xslt_module<br>
--with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl<br>
--with-mail --with-mail_ssl_module<br>
--add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-auth-pam<br>
--add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-echo<br>
--add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-upstream-fair<br>
--add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-dav-ext-module<br>
<br>
Posted at Nginx Forum: <a href="http://forum.nginx.org/read.php?21,235256,235256#msg-235256" target="_blank">http://forum.nginx.org/read.php?21,235256,235256#msg-235256</a><br>
<br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></blockquote></div><br></div>