Нужен коллективный мозговой штурм :). Существует тяжелое приложение 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;