Не работает proxy_cache_use_stale ?
Igor Sysoev
is at rambler-co.ru
Tue May 5 21:18:17 MSD 2009
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>" "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 --------------
Index: src/http/ngx_http_upstream.c
===================================================================
--- src/http/ngx_http_upstream.c (revision 2123)
+++ src/http/ngx_http_upstream.c (working copy)
@@ -1472,13 +1472,10 @@
static ngx_int_t
ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)
{
+ ngx_int_t rc;
ngx_uint_t status;
ngx_http_upstream_next_t *un;
- if (!(u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_STATUS)) {
- return NGX_DECLINED;
- }
-
status = u->headers_in.status_n;
for (un = ngx_http_upstream_next_errors; un->status; un++) {
@@ -1494,12 +1491,15 @@
#if (NGX_HTTP_CACHE)
- if (u->peer.tries == 0
- && u->stale_cache
- && (u->conf->cache_use_stale & un->mask))
- {
- ngx_http_upstream_finalize_request(r, u,
- ngx_http_upstream_cache_send(r, u));
+ if (u->stale_cache && (u->conf->cache_use_stale & un->mask)) {
+
+ rc = u->reinit_request(r);
+
+ if (rc == NGX_OK) {
+ rc = ngx_http_upstream_cache_send(r, u);
+ }
+
+ ngx_http_upstream_finalize_request(r, u, rc);
return NGX_OK;
}
@@ -2650,9 +2650,15 @@
#if (NGX_HTTP_CACHE)
if (u->stale_cache && (u->conf->cache_use_stale & ft_type)) {
+ ngx_int_t rc;
- ngx_http_upstream_finalize_request(r, u,
- ngx_http_upstream_cache_send(r, u));
+ rc = u->reinit_request(r);
+
+ if (rc == NGX_OK) {
+ rc = ngx_http_upstream_cache_send(r, u);
+ }
+
+ ngx_http_upstream_finalize_request(r, u, rc);
return;
}
#endif
More information about the nginx-ru
mailing list