需要一些集体头脑风暴:)。有一个繁重的 PHP 应用程序(例如 Magento),每次访问者点击一个不存在的页面(或者应用程序的特定部分出现问题并返回错误)时,应用程序服务器上的负载就会滚雪球:
如果页面不存在,它们不会被缓存,应用程序会花费大量资源来检查所有内容并生成缓存副本,这将浪费时间;
如果应用程序的一部分出现问题,应用程序将花费宝贵的时间来生成这些错误响应,以牺牲网站健康部分的访问者的利益。
这里的想法是在 nginx 前端缓存来自 FastCGI 后端的所有负面响应,例如 404 和 5xx,例如 5 分钟 - 这将显着降低对应用程序服务器的性能影响。
使用 fastcgi_cache_* 指令可以很容易地实现缓存。但是,一旦您在 fastcgi_pass 所在的位置块中定义了 fastcgi_cache_* 指令,它将尝试缓存通过该位置块的所有内容。
因此,问题是如何将 fastcgi_cache 限制为仅来自后端脚本的 404 响应?
只是为了进一步说明这个场景。想象一下,一个请求到达 /app/missing,应用程序在 /index.php 中有它的唯一入口点,所以 nginx 会将请求传递给调用 /index.php/app/missing 的后端 FastCGI 服务器。现在,由于 /app/missing 不存在 index.php 将返回 HTTP 404。此路由将在您请求 /app/missing 时多次占用 CPU。需要的是,一旦从 index.php 返回 HTTP 404,/app/missing 就会与来自 nginx 上 index.php 的结果 404 页面一起缓存,因此如果有人立即请求 /app/missing,则不会对PHP 后端,但返回一个缓存页面。