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