Итак, похоже, я неправильно понял директивы кэша прокси NGINX. Документы довольно запутанные по этому вопросу, поэтому я изложу их по пунктам.
На этой официальной справочной странице приведен приличный обзор различных директив, однако он не упоминает чего-то, что, как оказалось, является очень важным концептуальным строительным блоком в понимании того, как работает NGINX кэширование: понятие кэшированного файла устаревшее .
NGINX s default Поведение заключается в том, чтобы всегда использовать кеш, если он там есть, а не запрашивать вышестоящий сервер. С этой конфигурацией, минимальной конфигурацией для кэширования, NGINX будет запрашивать вышестоящий сервер при первом обращении к странице, а затем использовать кешированную версию навсегда:
events {
}
http {
proxy_cache_path
/path/to/cache
keys_zone=my_cache:10m;
proxy_cache_key "$request_method$request_uri";
server {
listen 8080;
location ~ ^/(.+)$ {
proxy_pass http://0.0.0.0:8000/$1;
proxy_cache cache;
}
}
}
Вы можете использовать proxy_cache_valid
директива, сообщающая NGINX, когда кэшированный файл следует считать "устаревшим". Например, если мы установим proxy_cache_valid 5m
, то через 5 минут после создания файла кэша NGINX прекратит его обслуживание и снова запросит вышестоящий сервер при следующем запросе. Если восходящий поток не работает, NGINX вернет 502. Однако в течение этих пяти минут NGINX будет по-прежнему использовать кеш, даже если сервер обратного потока доступен, так что это не то, что нам нужно.
NGINX имеет другую директиву proxy_cache_use_stale
, которая дает NGINX условия, при которых он может использовать кэшированные файлы , даже если они устарели. Мы можем объединить их вместе, чтобы получить сервер, который кэширует страницы, делает их устаревшими сразу (или почти сразу), а затем использует их, только если восходящий поток не работает:
events {
}
http {
proxy_cache_path
/path/to/cache
keys_zone=my_cache:10m;
proxy_cache_key "$request_method$request_uri";
server {
listen 8080;
location ~ ^/(.+)$ {
proxy_pass http://0.0.0.0:8000/$1;
proxy_cache cache;
proxy_cache_valid 1s;
proxy_cache_use_stale error timeout;
}
}
}
Эта конфигурация почти соответствует поведению, которое мы хочу, за исключением того, что если вышестоящий сервер отключается в течение продолжительного периода времени, NGINX будет продолжать использовать кэш бесконечно. Насколько я знаю, нет способа сказать NGINX полностью аннулировать / очистить кешированный файл через заданный промежуток времени. Обычно это то, для чего proxy_cache_valid
, но мы уже используем это для другой цели, чтобы сделать файлы устаревшими через 1 секунду, чтобы они только использовались, когда восходящий поток не работает. Нам понадобится следующий уровень после «устаревшего», что означает, что файл полностью признан недействительным, но я не думаю, что он существует в NGINX.
Так что самое простое решение - просто очистить кэш вручную. Достаточно просто удалить все файлы в каталоге кэша (или его подкаталогах), которые в последний раз модифицировались более 6 часов go, или любое другое время истечения срока действия. В системе Linux этот сценарий можно запускать каждые 5 минут, например:
find /path/to/cache -type f -mmin +360 -delete