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

nginx: как кэшировать только отрицательные ответы FastCGI

Нужен коллективный мозговой штурм :). Существует тяжелое приложение PHP (например, Magento), и каждый раз, когда посетитель попадает на несуществующую страницу (или возникает проблема с определенной частью приложения, и оно возвращает ошибки), нагрузка на сервер приложений растет как снежный ком:

Идея здесь состоит в том, чтобы кэшировать все отрицательные ответы, такие как 404 и 5xx, исходящие от бэкэнда FastCGI на интерфейсе nginx, например, на 5 минут - это значительно снизит влияние на производительность серверов приложений.

Кеширование можно довольно легко реализовать с помощью директив fastcgi_cache_ *. Однако, как только вы определите директивы fastcgi_cache_ * в блоке местоположения, где находится fastcgi_pass, он попытается кэшировать все, что проходит через этот блок местоположения.

Следовательно, вопрос в том, как ограничить fastcgi_cache, скажем, 404 ответами только от серверных скриптов?

Просто чтобы еще немного проиллюстрировать сценарий. Представьте, что запрос идет в / app / missing, приложение имеет только точку входа в /index.php, поэтому nginx передаст запрос на внутренний сервер FastCGI, вызывающий /index.php/app/missing. Теперь, поскольку / app / missing не существует, index.php вернет HTTP 404. Этот маршрут будет перегружать процессор столько раз, сколько вы запросите / app / missing. Желательно, чтобы после того, как HTTP 404 был возвращен из index.php, / app / missing кэшировался с полученной страницей 404 из index.php на nginx, поэтому, если кто-то сразу запросит / app / missing нет вызов выполняется в серверную часть PHP, но возвращается кешированная страница.

Это может помочь:

fastcgi_cache_valid 200 301 302 0;
fastcgi_cache_valid 404 500 503 5m;

Если nginx не допускает здесь значения 0, вам нужно заставить приложение PHP добавить HTTP-заголовок X-Accel-Expires: 0 для вывода на действительные страницы, а затем добавьте эту строку в конфигурацию nginx:

fastcgi_cache_valid 404 500 503 5m;