nginx 在响应 5xx 时阻止代理/fast_cgi 缓存

nginx 在响应 5xx 时阻止代理/fast_cgi 缓存

我有带后端 nodejs/php-fpm 后端的 nginx,如何告诉 nginx 不要缓存响应 5xx 或 4xx,即使它与缓存参数匹配。

PHP/Node.js 标头通过 http 标头响应长缓存时间:

HTTP/1.1 500 Internal Server Error
Date: Thu, 09 Mar 2017 09:41:03 GMT
Pragma: public
Expires: Thu, 09 Mar 2018 09:41:03 GMT
Cache-Control: public, max-age=31536000
X-Accel-Expires: Thu, 09 Mar 2018 09:41:03 GMT

即使状态代码为 500,响应也会缓存,如何防止这种情况?

nginx配置:

  location / {
    proxy_cache_methods GET;
    proxy_cache_key $request_uri;
    proxy_cache cache;
    proxy_cache_valid 200 1h;
    proxy_cache_use_stale error timeout invalid_header updating;
    proxy_cache_bypass 0;
    proxy_no_cache 0;
    proxy_redirect off;
    proxy_pass http://node-app;
  }

答案1

嗯,这很奇怪,你的后端发送了Cache-Control4xx/5xx 错误的标头。

proxy_cache_validNginx 可以通过指令进行配置或者Cache-Control它可以从/ /... 标头中获取缓存设置Expires。此选项可以混合使用,但不适合你的情况。

因此,您有两个选择:

  1. Cache-Control要求您的开发人员在不需要时不要发送标头(例如 4xx/5xx 代码)
  2. 配置 Nginx 以禁用Expires/Cache-Control后端响应标头的处理proxy_ignore_headers

答案2

默认情况下,nginx 将尊重Cache-Control从后端接收到的代理缓存,例如https://forum.nginx.org/read.php?2,268813,268814

因此,最好的解决方案似乎是更改后端,以便在出现错误时停止发出这些标题。

如果你真的想覆盖 nginx 中的那些 500,也许可以使用proxy_cache_valid使用 500 和 0 作为参数?这肯定意味着要对后端进行二次猜测,因此无论如何都可能产生意想不到的后果。

相关内容