proxy_cache_revalidate

Andrey Vlasov nginx-forum at nginx.us
Sun Apr 12 12:19:02 UTC 2015


Добрый день,
Если я правильно понимаю, то при ревалидации данные в кеше должны быть
обновлены (повторно загружены с бекенда), только если они обновились на
бекенде (if-Modified-Since/If-None-Match отличается от Last-modified), но
судя по логам, данные с бекенда берутся в полном объеме, даже если они не
изменились.

example.com -> proxy -> backend
*прокси тут только для статистики трафика, если его исключить, картина не
измениться 

proxy_cache_path one levels=1:2 keys_zone=one:10m inactive=24h max_size=1G;
server {
	listen       80;
	server_name  backend;
	location / { root /var/www/backend; }
}

server {
	listen       80;
	server_name   example.com;

	location / {
	proxy_set_header Host backend;
	proxy_pass http://unix:/tmp/proxy.sock;
	proxy_cache one;
	proxy_cache_revalidate on;
	proxy_cache_valid 200 1m;  
	}
}

server {
	listen       unix:/tmp/proxy.sock;
	server_name  proxy;

	location / {
	proxy_pass http://$host;
	}
}

backend отвечает файлом index.html размером в 1 мб

лог трафика example.com
request_length:73 bytes_sent:105997 body_bytes_sent:105768 # (MISS)
request_length:73 bytes_sent:591528 body_bytes_sent:591300 # (HIT)
request_length:73 bytes_sent:164076 body_bytes_sent:163840 # (REVALIDATED)

лог трафика proxy
request_length:91 bytes_sent:1048769 body_bytes_sent:1048576 # (MISS)
request_length:175 bytes_sent:4096 body_bytes_sent:3918 # (REVALIDATED)

лог трафика backend
request_length:91 bytes_sent:1048769 body_bytes_sent:1048576 # (MISS)
request_length:175 bytes_sent:1048754 body_bytes_sent:1048576 #
(REVALIDATED)
---------
Из лога видно, что 1 запрос передается на proxy, потом на backend, 2 запрос
отдается с example.com из кеша не затрагивая proxy и как следствие backend
(и не попадает в их логи), а вот 3 запрос … когда идет ревалидация меня
завел в тупик,  proxy отправляет example.com  4096 байт, но вот backend
отправляет на proxy полностью весь ответ (1048769)

при ревалидации получается вот так
example.com <-4096- proxy <-1048769- backend
хотя должно быть вот так
example.com <-4096- proxy <-4096- backend
----
в чем тут проблема? как не загружать с бекенда полностью весь ответ (1048769
bytes), а только обновить данные что кеш валидный затратив на это всего 4096
bytes

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,257971,257971#msg-257971



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