Я поставил 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 из-за проблем с избыточной емкостью.