Назад | Перейти на главную страницу

Nginx Stale Cache и proxy_cache_path

Я поставил Nginx перед сервером приложений php в качестве обратного прокси для кэширования динамического содержимого и сохранения некоторых обращений на php.

Я настроил Nginx с параметрами, указанными ниже, в надежде, что я добьюсь следующего поведения.

1) Nginx будет кэшировать содержимое кода состояния 200 в течение 20 минут, прежде чем он попытается выполнить повторную выборку с серверов приложений.

2) Кеш будет оставаться на месте до 7 дней для обработки устаревших запросов на редко доступный контент.

3) Запросы, поступающие через 20 минут после первоначального кэширования содержимого, будут запускать запрос к бэкэнду на новое обновление, но будут обслуживать устаревшую версию, поэтому клиент получит мгновенный ответ.

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:512m inactive=7d max_size=15000m;
proxy_cache_use_stale timeout updating error invalid_header;
proxy_cache_valid 200 20m; 
proxy_cache_valid       404 1m;
proxy_cache_valid       any 15m;

ОБНОВЛЕНИЕ: после выполнения еще нескольких тестов и просмотра журналов сервера выяснилось, что контент старше 20 м не обслуживается из кеша как устаревший, а просто накапливается в cache_file_system.

Есть идеи, как заставить Nginx обслуживать устаревший контент в течение длительного периода времени? Вариант использования в основном заключается в кэшировании редко используемого контента, создание которого на моих серверах приложений обходится дорого. Возможность обслуживать устаревшие элементы через несколько дней после истечения срока их хранения в кеше, когда, наконец, поступает попадание, будет большим приростом производительности. Если это невозможно с Nginx, я открыт для других вариантов прокси / кеширования (я использую этот экземпляр Nginx только в качестве кеша).

Оказывается, это не так в настоящее время возможно с Nginx. В итоге я установил Varnish с длинным TTL (7 дней), а также с длительным периодом отсрочки (2 дня). Затем я использую сценарий для каждого URL-адреса каждые несколько дней и принудительное прогревание тайника.

Учитывая объем контента, который мне нужно кэшировать, и то, как редко осуществляется доступ к каждому элементу, я сначала был обеспокоен тем, что стоимость запуска Varnish будет непомерно высокой (вся эта оперативная память!) - вот почему я смотрел файл Nginx на основе кеширования. Однако в Varnish действительно есть опция кэширования с файловой поддержкой, которая мне очень понравилась. Пока мой кеш составляет около 80 ГБ и работает очень хорошо!

Все они хорошо выглядят. Вы пытались спросить, почему это не работает?

Я бы добавил, что ваш proxy_use_stale, вероятно, должен иметь другие коды ошибок HTTP. Я предполагаю, что вы захотите продолжить обслуживание устаревших данных из кеша, если php возвращает 503 из-за проблем с избыточной емкостью.