В nginx 1.10.1 я проксирую внешний веб-сайт (не находящийся под моим контролем) для локального кеширования изображений.
моя конфигурация следующая:
location ~ /cachedimages/(?<productcode>.*)/(?<size>.*)/image.jpg {
resolver 127.0.0.1;
proxy_pass https://www.externalsite.example/api/getImage/?productcode=$productcode&size=$size;
proxy_cache imgcache;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
expires 1M;
access_log off;
add_header 'Cache-Control' "public";
add_header Last-Modified $upstream_http_last_modified;
add_header X-Proxy-Cache $upstream_cache_status;
}
imgcache
определяется имеет следующее:
proxy_cache_path /var/cache/nginx/imgcache levels=1:2 keys_zone=imgcache:10m max_size=1g inactive=24h;
Удаленный сервер не дает Last-Modified
заголовок:
curl -X GET -I https://www.externalsite.example/api/getImage/?productcode=abc123&size=128
HTTP/1.1 200 OK
Date: Thu, 15 Sep 2016 08:16:07 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: image/jpeg
и мой сервер добавляет заголовок, но не Last-Modified
curl -X GET -I https://www.myserver.com/cachedimages/abc123/128/image.jpg
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 15 Sep 2016 08:33:26 GMT
Content-Type: image/jpeg
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Sat, 15 Oct 2016 08:33:26 GMT
Cache-Control: max-age=2592000
Cache-Control: public
X-Proxy-Cache: HIT
Как я могу заставить nginx читать время mtime кешированного (и удачного) файла и использовать его как Last-Modified
значение заголовка?
В $upstream_http_*
встроенная переменная хранит заголовки, отправленные вышестоящим сервером, в кеше. Ты можешь злоупотребление в Date:
заголовок, отправленный восходящим потоком для заполнения заголовка Last-Modified, отправленного вашим обратным прокси-сервером, например:
add_header Last-Modified '$upstream_http_date';
Работает как положено:
Last-Modified: Sun, 22 Apr 2018 08:48:44 GMT
X-Cached: MISS
...
Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
X-Cached: HIT
...
Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
X-Cached: HIT
Более подробная информация о $ upstream_http_ * здесь: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables (найдите $ upstream_http_name).
При этом, имхо, вы пытаетесь достичь в общем-то плохая идея: обратный прокси-сервер не знает, был ли объект обновлен в восходящем направлении с момента его последней выборки или нет, но он сообщит клиенту ниже по потоку, что объект не был изменен. Это ложная информация.
Конечно, могут быть причины, по которым вы хотите это сделать, например, если у вас есть полный контроль над любым обновлением объекта, происходящим в восходящем потоке, и / или если вы планируете очищать кеш обратного прокси-сервера вручную каждый раз, когда это необходимо.
Если у вас единственный обратный прокси-сервер, я настоятельно рекомендую вам изучить ETags как лучшее решение вашей проблемы. Если у вас есть пул обратных прокси, использование ETags усложняется.