最近我的博客针对欧洲访客开启了访问加速,用的是 nginx 反代的方式。然而在设置的过程中发现,nginx 的 proxy 缓存永远是 MISSED
。
搜索发现很多博文都是说要设置 proxy_cache_valid
,然而这并没有解决我的问题,当然这个设置是必须的。
故事的转折仍然发生在这个设置上。在 nginx 的文档中,proxy_cache_valid
这一段的说明中提到
If the header includes the “Set-Cookie” field, such a response will not be cached.
If the header includes the “Vary” field with the special value “*”, such a response will not be cached (1.7.7). If the header includes the “Vary” field with another value, such a response will be cached taking into account the corresponding request header fields (1.7.7).
关键在于 cookie
。大部分的网页都会设置 cookie,于是会发送 Set-Cookie
和 Vary
头部,于是缓存就永远 Missed 了。
在设置了
proxy_cache_valid 1d;
proxy_ignore_headers Set-Cookie Vary;
之后,就成功的缓存了。有些博文提到了 Set-Cookie
,其实 Vary
也是必须的。
之后可以进一步设置
proxy_cache_bypass $http_pragma;
于是当浏览器强制刷新时,一般会发送一个 Pragma
头部,如果 nginx 收到这个头部就会 bypass 缓存了。