Не работает proxy_cache_lock on;
Pavel V.
pavel2000 at ngs.ru
Mon Dec 17 17:07:04 UTC 2012
Здравствуйте.
Пытаемся внедрять кеширование ответов от скриптов.
Кеширование происходит, но не работает директива proxy_cache_lock.
По логам сервера видно, что на апач одновременно передается несколько запросов,
хотя используется proxy_cache_lock on; и ожидается, что на апач упадет один запрос.
Подскажите, что сделано не так?
Подробности:
nginx version: nginx/1.1.17 , пакет nginx-full из оф. репозитария Debian.
Кусок лога (формат лога приведен ниже, вместе с частью конфигурации):
# tail -f /var/log/nginx/apache1.log |grep /ru/informers/small/
[test] "2.038" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.041" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.068" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.074" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.080" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.082" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.082" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.092" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "2.093" 9.2.3.4 - - [17/Dec/2012:16:40:13 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
[test] "2.420" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "127.0.0.1:80"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
[test] "-" 9.2.3.4 - - [17/Dec/2012:16:40:14 +0000] 200 "GET /ru/informers/small/51.png HTTP/1.0" 6853 "-" "ApacheBench/2.3" "-"
.... Далее идут логи запросов с ответами только из кэша
Этот лог снят в момент запуска команды
#ab -c 10 -k -n 10000 http://test/ru/informers/small/51.png
Аналогичное поведение видно для той же команды и в момент устаревания уже имеющегося элемента кэша.
Значащие директивы контекста http:
proxy_temp_path /var/cache/nginx/tmp;
proxy_cache_path /var/cache/nginx/test_my_informers levels=1 keys_zone=test_my_informers:10m;
log_format main '[$host] "$upstream_response_time" $remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr" ';
Других директив proxy_* в контексте http не описано.
Проксирование настроено только для одного локейшена на данном сервере (первый опыт :-) ).
Конфигурация server используемого вирт хоста:
server {
listen 1.2.3.4:80;
server_name test;
access_log /var/log/nginx/test-access.log;
error_log /var/log/nginx/test-error.log;
root /web/test/htdocs;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
location / {
access_log /var/log/nginx/apache1.log main;
access_log /var/log/nginx/test-access.log;
proxy_pass http://127.0.0.1:80;
proxy_read_timeout 60;
}
location ~ /([a-zA-Z]+)/informers/(small|medium|large)/([0-9]+)\.png$ {
access_log /var/log/nginx/apache1.log main;
access_log /var/log/nginx/test-access.log;
expires 5m;
proxy_pass http://127.0.0.1:80;
proxy_cache test_my_informers;
proxy_cache_valid 200 302 304 5m;
proxy_cache_lock on;
proxy_cache_key "$host$request_uri";
proxy_ignore_headers Expires Cache-Control Set-Cookie;
proxy_hide_header Set-Cookie;
}
}
Спасибо за возможные комментарии.
--
С уважением,
Pavel mailto:pavel2000 at ngs.ru
Подробная информация о списке рассылки nginx-ru