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