proxy_cache_background_update

Domrachev Ivan domrachev.ivan на gmail.com
Ср Июн 14 11:52:58 UTC 2017


приветствую

если одновременно использовать
sendfile on;
tcp_nopush on;
proxy_cache_background_update on;

то ломается логика работы proxy_cache_background_update: иногда возвращается часть закэщированного варианта,
потом енджайникс ждёт секунд 5 и досылает остаток.
если спрашивать раз в секунду, а proxy_cache_valid any 2s то в логах получается так:
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:46 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" MISS 5.123
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:47 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:48 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:54 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" STALE -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:55 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:56 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:03 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" STALE -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:04 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:05 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
тайминги запросов
        5.12 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys
        5.14 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys
        5.14 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys
        0.10 real         0.00 user         0.00 sys

если любую из этих опций отключить:
sendfile on;
tcp_nopush on;
то всё нормализуется

конфиг:
worker_processes 2;
pid shared/nginx/pid;
error_log shared/nginx/logs-raw/e.current warn;

events{worker_connections 1024;}

http {
 include mime.types;

 sendfile on;
 tcp_nopush on;

 log_format main '$remote_addr $host - [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_cache_status $upstream_response_time';

 access_log shared/nginx/logs-raw/a.current main;

 proxy_cache_path shared/nginx/temp/cache levels=1:2 keys_zone=cache:10m;

 proxy_cache_use_stale updating;
 proxy_cache_valid any 2s;
 proxy_cache_background_update on;
 proxy_cache cache;

 server {
  listen *:80;
  location / {proxy_pass http://127.0.0.1:1500;}
 }

}

запрашивалка
while true;do time wget -q http://127.0.0.1/ -O /dev/null;sleep 1;done

запрашивалка, что бы видить, что часть запроса таки приходит
while true;do time wget -q http://127.0.0.1/ -O -;sleep 1;done

лагающий вебсервер
perl -MIO::All -e 'io(":1500")->fork->accept->(sub{if(/^GET/){sleep(5);$_[0]<"HTTP/1.1 200 OK\nContent-Length: 65536\n\n"."x"x65536}})'

ОС: freebsd 10.1
nginx: 1.13.1



Подробная информация о списке рассылки nginx-ru