nginx:如何只caching负面的FastCGI响应

需要一些集体头脑风暴:)。 有一个沉重的PHP应用程序(例如Magento),每次访问者遇到一个不存在的页面(或者应用程序的特定部分有问题,并且它返回错误),应用程序服务器上的负载就是滚雪球:

  • 在不存在页面的情况下,它们不会被caching,应用程序花费相当多的资源来检查所有内容并生成caching副本,这将浪费时间;

  • 在部分应用程序出现问题的情况下,应用程序将花费宝贵的时间来生成这些错误响应,以牺牲站点健康部分的访问者为代价。

这里的想法是将来自FastCGI后端的404和5xx等所有负面响应caching在nginx前端5分钟 – 这将显着降低对应用程序服务器的性能影响。

使用fastcgi_cache_ *指令可以很容易地实现caching。 但是,一旦在fastcgi_pass所在的位置块中定义了fastcgi_cache_ *指令,它将尝试caching经过该位置块的所有内容。

因此,问题是如何将fastcgi_cache限制为仅来自后端脚本的404响应?

只是为了说明情况多一点。 想象一下,一个请求到/ app / missing,应用程序只有在/index.php中的入口点,所以nginx会将请求传递给调用/index.php/app/missing的后端FastCGI服务器。 现在,由于/ app / missing不存在,index.php将返回HTTP 404.这个路由将会像请求/ app / missing一样紧缩CPU。 我们希望的是,一旦HTTP 404从index.php返回,/ app / missing将被从nginx的index.php中得到的404页面caching起来,所以如果有人请求/ app /马上丢失, PHP后端,但返回一个caching页面。

这可以做到这一点:

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

如果nginx在这里不允许为0,那么你需要让PHP应用程序在有效页面上添加HTTP头X-Accel-Expires: 0到它的输出,然后在nginx config:

 fastcgi_cache_valid 404 500 503 5m;