Re: Не работает proxy_cache_use_stale ?

Flam Boyant flamboyant2 at gmail.com
Wed May 6 16:18:35 MSD 2009


Вот какой еще заметил эффект - если из кеша берется несвежий файл (скажем
если бекенд дает 500 ошибку) - в логах это отображается почему то как
получение файла с бекенда.
Пример.
Логи описаны как

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  '"$status/$upstream_status" $body_bytes_sent '
  '"$host" "$upstream_addr/$upstream_response_time"';

Запрашиваем файл
192.168.7.6 - - [06/May/2009:14:16:41 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.245"

Дальнейшие запросы в течении 5 минут достают его из кеша -
192.168.7.6 - - [06/May/2009:14:16:43 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/-" 23 "www.xxx.net" "-/-"
192.168.7.6 - - [06/May/2009:14:16:53 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/-" 23 "www.xxx.net" "-/-"
192.168.7.6 - - [06/May/2009:14:16:53 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/-" 23 "www.xxx.net" "-/-"

То есть $upstream_status, $upstream_addr и $upstream_response_time равны
"-".
Далее ждем 5 минут, ломаем test.cgi и снова запрашиваем файл.
Он достается из кеша, но в логах видим вот что -

192.168.7.6 - - [06/May/2009:14:24:25 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.040"
192.168.7.6 - - [06/May/2009:14:24:26 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.041"
192.168.7.6 - - [06/May/2009:14:24:26 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.040"
192.168.7.6 - - [06/May/2009:14:24:27 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.040"

Если починить test.cgi и запросить его снова - все Ок, файл запрашивается с
бекенда и снова кешируется -
192.168.7.6 - - [06/May/2009:14:24:36 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/200" 23 "www.xxx.net" "127.0.0.1:8000/0.055"
192.168.7.6 - - [06/May/2009:14:24:37 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/-" 23 "www.xxx.net" "-/-"
192.168.7.6 - - [06/May/2009:14:24:37 +0300] "GET /cgi/test.cgi HTTP/1.0"
"200/-" 23 "www.xxx.net" "-/-"

Это баг или фича?
Если фича,то можно как нибудь отображать факт неработоспособности бекенда?

5 мая 2009 г. 20:18 пользователь Igor Sysoev <is at rambler-co.ru> написал:

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


More information about the nginx-ru mailing list