<div>Вот какой еще заметил эффект - если из кеша берется несвежий файл (скажем если бекенд дает 500 ошибку) - в логах это отображается почему то как получение файла с бекенда.<br>Пример.<br>Логи описаны как<br><br>log_format main &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;<br>
  &#39;&quot;$status/$upstream_status&quot; $body_bytes_sent &#39;<br>  &#39;&quot;$host&quot; &quot;$upstream_addr/$upstream_response_time&quot;&#39;;<br><br>Запрашиваем файл<br>192.168.7.6 - - [06/May/2009:14:16:41 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.245">127.0.0.1:8000/0.245</a>&quot;<br>
<br>Дальнейшие запросы в течении 5 минут достают его из кеша -<br>192.168.7.6 - - [06/May/2009:14:16:43 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;-/-&quot;<br>
192.168.7.6 - - [06/May/2009:14:16:53 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;-/-&quot;<br>192.168.7.6 - - [06/May/2009:14:16:53 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;-/-&quot;<br>
<br>То есть $upstream_status, $upstream_addr и $upstream_response_time равны &quot;-&quot;.<br>Далее ждем 5 минут, ломаем test.cgi и снова запрашиваем файл.<br>Он достается из кеша, но в логах видим вот что - <br><br>192.168.7.6 - - [06/May/2009:14:24:25 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.040">127.0.0.1:8000/0.040</a>&quot;<br>
192.168.7.6 - - [06/May/2009:14:24:26 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.041">127.0.0.1:8000/0.041</a>&quot;<br>
192.168.7.6 - - [06/May/2009:14:24:26 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.040">127.0.0.1:8000/0.040</a>&quot;<br>
192.168.7.6 - - [06/May/2009:14:24:27 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.040">127.0.0.1:8000/0.040</a>&quot;<br>
<br>Если починить test.cgi и запросить его снова - все Ок, файл запрашивается с бекенда и снова кешируется -<br>192.168.7.6 - - [06/May/2009:14:24:36 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.055">127.0.0.1:8000/0.055</a>&quot;<br>
192.168.7.6 - - [06/May/2009:14:24:37 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;-/-&quot;<br>192.168.7.6 - - [06/May/2009:14:24:37 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net">www.xxx.net</a>&quot; &quot;-/-&quot;<br>
<br>Это баг или фича?<br>Если фича,то можно как нибудь отображать факт неработоспособности бекенда?<br><br></div><div>5 мая 2009 г. 20:18 пользователь Igor Sysoev <span dir="ltr">&lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt;</span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Tue, May 05, 2009 at 06:41:24PM +0300, Flam Boyant wrote:<br>
<br>
&gt; Применил патч.<br>
&gt; Если запросить файл по истечении таймаута  - получаем ответ с HTTP result<br>
&gt; code 0.<br>
&gt; Вот дамп ответа<br>
&gt; HTTP/1.0 0 Init<br>
&gt; Server: nginx/0.7.54<br>
&gt; Date: Tue, 05 May 2009 15:29:27 GMT<br>
&gt; Content-Type: text/html; charset=windows-1251<br>
&gt; Vary: user-agent<br>
&gt; Connection: keep-alive<br>
&gt;<br>
&gt; Hello world! 1241537009<br>
&gt;<br>
&gt; В логах соответсвенно -<br>
&gt; 192.168.7.6 - - [05/May/2009:18:29:27 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot;<br>
</div>&gt; &quot;0/500&quot; 23 &quot;<a href="http://www.xn--u1aaa.net" target="_blank">www.ххх.net</a> &lt;<a href="http://www.xn--u1aaa.net" target="_blank">http://www.xn--u1aaa.net</a>&gt;&quot; &quot;<a href="http://127.0.0.1:8000/0.038" target="_blank">127.0.0.1:8000/0.038</a>&quot;<br>

<div class="im">&gt;<br>
&gt; Firefox при этом ждет файла несколько минут, потом все таки показывает<br>
&gt; результат.<br>
&gt; Пробовал играться с таймаутами прокси - не помогает.<br>
&gt; 5 мая 2009 г. 17:51 пользователь Igor Sysoev &lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt; написал:<br>
<br>
</div>Предыдущий патч откатить, новый накатить.<br>
<div><div class="h5"><br>
&gt; &gt; On Tue, May 05, 2009 at 05:08:51PM +0300, Flam Boyant wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; Всем привет!<br>
&gt; &gt; &gt; Есть nginx-0.7.54 на Linux, есть желание сделать на нем &quot;перманентный<br>
&gt; &gt; кеш&quot; -<br>
&gt; &gt; &gt; то есть если бекенд недоступен, то файл отдается из кеша, даже если он<br>
&gt; &gt; &gt; устарел.<br>
&gt; &gt; &gt; Конфигурация nginx такая -<br>
&gt; &gt; &gt; worker_processes 4;<br>
&gt; &gt; &gt; worker_rlimit_nofile 10240;<br>
&gt; &gt; &gt; error_log logs/error.log;<br>
&gt; &gt; &gt; pid logs/nginx.pid;<br>
&gt; &gt; &gt; events {<br>
&gt; &gt; &gt;   worker_connections 4096;<br>
&gt; &gt; &gt; }<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; http {<br>
&gt; &gt; &gt;   include mime.types;<br>
&gt; &gt; &gt;   default_type application/octet-stream;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   log_format main &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;<br>
&gt; &gt; &gt;   &#39;&quot;$status/$upstream_status&quot; $body_bytes_sent &#39;<br>
&gt; &gt; &gt;   &#39;&quot;$host&quot; &quot;$upstream_addr/$upstream_response_time&quot;&#39;;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   access_log logs/access.log main;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   sendfile on;<br>
&gt; &gt; &gt;   tcp_nopush on;<br>
&gt; &gt; &gt;   tcp_nodelay on;<br>
&gt; &gt; &gt;   keepalive_timeout 65 20;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   client_header_timeout 3m;<br>
&gt; &gt; &gt;   client_body_timeout 3m;<br>
&gt; &gt; &gt;   send_timeout 3m;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   client_header_buffer_size 4k;<br>
&gt; &gt; &gt;   large_client_header_buffers 4 4k;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   client_max_body_size 1m;<br>
&gt; &gt; &gt;   client_body_buffer_size 128k;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   output_buffers 4 32k;<br>
&gt; &gt; &gt;   postpone_output 1460;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   proxy_connect_timeout 10;<br>
&gt; &gt; &gt;   proxy_send_timeout 90;<br>
&gt; &gt; &gt;   proxy_read_timeout 90;<br>
&gt; &gt; &gt;   proxy_buffer_size 128k;<br>
&gt; &gt; &gt;   proxy_buffers 4 128k;<br>
&gt; &gt; &gt;   proxy_busy_buffers_size 128k;<br>
&gt; &gt; &gt;   proxy_temp_file_write_size 128k;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   gzip off;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   proxy_cache_key &quot;$scheme://$host$uri$is_args$args:&quot;;<br>
&gt; &gt; &gt;   proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=one:10m<br>
&gt; &gt; &gt; inactive=20m max_size=500m;<br>
&gt; &gt; &gt;   proxy_cache one;<br>
&gt; &gt; &gt;   proxy_cache_min_uses 1;<br>
&gt; &gt; &gt;   proxy_cache_valid 200 302 5m;<br>
&gt; &gt; &gt;   proxy_cache_valid 301 1h;<br>
&gt; &gt; &gt;   proxy_cache_use_stale error timeout invalid_header http_500 http_502<br>
&gt; &gt; &gt; http_503 http_504;<br>
&gt; &gt; &gt;   proxy_ignore_headers X-Accel-Redirect X-Accel-Expires Expires<br>
&gt; &gt; &gt; Cache-Control;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   set_real_ip_from 127.0.0.1;<br>
&gt; &gt; &gt;   real_ip_header X-Forwarded-For;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;   server {<br>
&gt; &gt; &gt;     listen 9090;<br>
&gt; &gt; &gt;     server_name localhost;<br>
&gt; &gt; &gt;     location / {<br>
&gt; &gt; &gt;       proxy_pass <a href="http://localhost:8000" target="_blank">http://localhost:8000</a>;<br>
&gt; &gt; &gt;       proxy_set_header Host $host;<br>
&gt; &gt; &gt;       proxy_set_header X-Forwarded-For $remote_addr;<br>
&gt; &gt; &gt;   }<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;     error_page 500 502 503 504 /50x.html;<br>
&gt; &gt; &gt;     location = /50x.html {<br>
&gt; &gt; &gt;      root html;<br>
&gt; &gt; &gt;     }<br>
&gt; &gt; &gt;   }<br>
&gt; &gt; &gt; }<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Проверяем - создаем простенький test.cgi, запрашиваем его, убежаемся что<br>
&gt; &gt; &gt; файл попал в кеш - тут все ок.<br>
&gt; &gt; &gt; Файл на диске есть -<br>
&gt; &gt; &gt; $ find /usr/local/nginx/cache -type f -exec grep &quot;/cgi/test.cgi:&quot; {} \;<br>
&gt; &gt; &gt; Binary file /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; matches<br>
&gt; &gt; &gt; $ ls -al /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; -rw------- 1 nobody nobody 322 May 5 16:43<br>
&gt; &gt; &gt; /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; Да и по логам видно - файл отдается из кеша.<br>
&gt; &gt; &gt; 192.168.7.6 - - [05/May/2009:16:43:00 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot;<br>
&gt; &gt; &gt; &quot;200/200&quot; 23 &quot;<a href="http://www.xxx.net" target="_blank">www.xxx.net</a>&quot; &quot;<a href="http://127.0.0.1:8000/0.057" target="_blank">127.0.0.1:8000/0.057</a>&quot;<br>
&gt; &gt; &gt; 192.168.7.6 - - [05/May/2009:16:46:30 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot;<br>
&gt; &gt; &gt; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net" target="_blank">www.xxx.net</a>&quot; &quot;-/-&quot;<br>
&gt; &gt; &gt; Ломаем test.cgi - чтобы при запросе выдавал 500-ую ошибку.<br>
&gt; &gt; &gt; Пробуем еще раз - все ок - файл отдается из кеша -<br>
&gt; &gt; &gt; 192.168.7.6 - - [05/May/2009:16:47:31 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot;<br>
&gt; &gt; &gt; &quot;200/-&quot; 23 &quot;<a href="http://www.xxx.net" target="_blank">www.xxx.net</a>&quot; &quot;-/-&quot;<br>
&gt; &gt; &gt; Но у нас еще не истекло время хранения. Ждем 5 минут и пробуем еще раз -<br>
&gt; &gt; &gt; 192.168.7.6 - - [05/May/2009:16:50:17 +0300] &quot;GET /cgi/test.cgi HTTP/1.0&quot;<br>
</div></div>&gt; &gt; &gt; &quot;500/500&quot; 593 &quot;<a href="http://www.xxx.net" target="_blank">www.xxx.net</a> &lt;<a href="http://www.liga.net" target="_blank">http://www.liga.net</a>&gt;&quot; &quot;<a href="http://127.0.0.1:8000/0.039" target="_blank">127.0.0.1:8000/0.039</a>&quot;<br>

<div class="im">&gt; &gt; &gt; То есть несмотря на то что  proxy_cache_use_stale прописана обращения к<br>
&gt; &gt; кешу<br>
&gt; &gt; &gt; нет - идет обращение на бекенд!<br>
&gt; &gt; &gt; Файл в кеше еще есть -<br>
&gt; &gt; &gt; $ find /usr/local/nginx/cache -type f -exec grep &quot;/cgi/test.cgi:&quot; {} \;<br>
&gt; &gt; &gt; Binary file /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; matches<br>
&gt; &gt; &gt; $ ls -al /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; -rw------- 1 nobody nobody 322 May 5 16:43<br>
&gt; &gt; &gt; /usr/local/nginx/cache/e/aa/5fd721f295024d972798697193182aae<br>
&gt; &gt; &gt; Просьба ткнуть носом где туплю.<br>
&gt; &gt;<br>
&gt; &gt; Патч.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; Игорь Сысоев<br>
&gt; &gt; <a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
&gt; &gt;<br>
<br>
</div>--<br>
<div><div class="h5">Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
</div></div></blockquote></div><br><div><br></div>