Re: Не работает proxy_cache_lock on;
Maxim Dounin
mdounin at mdounin.ru
Tue Dec 18 11:52:50 UTC 2012
Hello!
On Tue, Dec 18, 2012 at 12:07:04AM +0700, Pavel V. wrote:
> Пытаемся внедрять кеширование ответов от скриптов.
> Кеширование происходит, но не работает директива 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
>
> Аналогичное поведение видно для той же команды и в момент устаревания уже имеющегося элемента кэша.
Для устаревания подобное поведение нормально - для устаревших
ответов следует использовать
proxy_cache_use_stale updating;
См. http://nginx.org/r/proxy_cache_use_stale/ru.
В приведённом логе, к сожалению, отсутствует $upstream_cache_status,
но подозреваю, что там было бы не MISS, а EXPIRED - т.е. речь идёт
об обновлении устаревшего элемента кеша. В этом случае
proxy_cache_lock работать и не должен.
--
Maxim Dounin
http://nginx.com/support.html
Подробная информация о списке рассылки nginx-ru