Не работает 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