我注意到我的 Nginx 代理实例中缓存了一些 406 状态,我想确保这种情况不会再次发生。
我发现一个可能的原因是有人设置了proxy_cache_valid any
几分钟的 ,必须将其删除。我目前的理解是,默认情况下不会缓存任何内容,然后如果有proxy_cache_valid
,则使用 ,然后如果有任何缓存控制或过期标头,它们将覆盖该设置。
因此,如果我理解正确的话,我认为默认情况下错误不会被缓存,但如果 HTTP 标头覆盖它,则可以缓存它。一种解决方案是通常忽略这些 HTTP 标头。所以,第一个问题是我的理解是否正确。
假设所有这些都是真的,在我的情形下,我想保留此服务器上的缓存控制标头,所以我不想忽略它们。但是,我担心上游甚至可能在错误状态下设置它们。我正在寻找一种解决方案,让我确定这些状态(如 500、503 等)永远不会被缓存。
以下是我对当前解决方案的想法:
http {
map $upstream_status $never_cache {
200 0; # Want to receive from cache as in proxy_cache_valid
301 0; # Want to receive from cache as in proxy_cache_valid
404 0; # Want to receive from cache as in proxy_cache_valid
500 0; # Want stale content from proxy_cache_use_stale
502 0; # Want stale content from proxy_cache_use_stale
503 0; # Want stale content from proxy_cache_use_stale
504 0; # Want stale content from proxy_cache_use_stale
default 1; # Everything else should never be cached
}
proxy_cache_valid 200 301 404 10m;
#proxy_cache_valid any 0s # No active line for this as it's default
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_no_cache $never_cache;
...
}
这些设置合理吗?它会达到我的预期吗?有没有更好的方法来实现这一点?我找不到太多关于如何做到这一点的文档,这让我觉得我错过了一些非常重要的东西。