Я использую nginx как обратный прокси и для кэширования. В настоящее время кэш для местоположения "/test" будет обновляться каждые 2 часа: "proxy_cache_valid 200 302 301 304 2h;"
Можно ли обновить кэш только в случае изменения файла?
Спасибо!
решение1
Это должно быть решено для вас в общем порядке.
Если файл кэширован в браузере и браузер снова запрашивает этот файл, а файл был удален из кэша сервера, сервер все равно будет просматривать заголовок if-modified-since
в запросе.
Сервер проверит это значение даты и времени, и если не обнаружит никаких изменений, сервер отправит ответ 304
, сообщающий браузеру, что можно загрузить кэшированную версию, а фактический объект не будет загружен на сервер и будет загружен повторно.
Если значение изменено, объект будет перемещен на сервер, а копия кэша обновлена.
https://www.keycdn.com/support/if-modified-since-http-header
IMHO, кэширование — это то, что действительно нужно контролировать с Cache-Control
помощью заголовков, а не конфигурации сервера.
Параметры конфигурации сервера существуют в качестве отказоустойчивого варианта на случай, если Cache-Control отсутствует или настроен нелогично.
решение2
Я предполагаю, что мы говорим о сгенерированном контенте, который еще не является статическим файлом на вашем веб-сервере (статические файлы на вашем веб-сервере обычно достаточно быстры).
Главный вопрос заключается в том, как сообщить Nginx об изменении кэшированного контента.
Повторная проверка звучит хорошо, но имеет последствия, так как в большинстве случаев процесс проверки обновлений столь же дорог, как и их генерация. Так что это не реальный вариант.
Лучше всего очищать содержимое в случае его обновления (например, изменения в CMS). Очистка — это процесс аннулирования кэшированных объектов. Nginx поддерживает очистку только в версии NginxPlus. Однако вы можете сделать почти то же самое, перезагрузив кэшированный объект.
Вот простое руководство:
Конфигурация Nginx
...
# default location
location / {
try_files $uri @php;
}
# PHP handler
location @php {
try_files $uri /index.php;
access_log /var/log/nginx/access.log;
# include fastcgi_params
include fastcgi_params;
# how to connect to PHP-FPM
fastcgi_pass php-fpm;
# enable caching
fastcgi_cache phpfpm;
# don't look for existing cache objects with HTTP header X-Purge
fastcgi_cache_bypass $http_x_purge;
}
...
Скручивание для очистки одного документа
curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"