【发布时间】:2022-05-21 09:59:49
【问题描述】:
我有一个 PHP CMS 作为提供内容的上游/源服务器。它位于配置为反向代理缓存的 Nginx Web 服务器后面,带有 proxy_pass 和 proxy_cache。
在上游/源服务器上实现304 Not Modified 响应时,我注意到我有时会从代理获得304 Not Modified 响应而没有调用我的上游/源服务器。
我的代理配置如下所示(注意我没有缓存 304 响应):
http {
#...
proxy_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=1024m inactive=1h;
}
server {
server_name _;
#...
location / {
proxy_cache microcache;
proxy_cache_revalidate on;
add_header X-Cache-Status $upstream_cache_status;
#...
proxy_cache_valid 200 301 302 1m;
proxy_pass http://upstream;
}
}
第一次访问 URL 时,我得到一个带有 X-Cache-Status: MISS 的 200 以及由源返回的 ETag 和 Last-Modified 标头。
我第二次点击该 URL,我得到一个 X-Cache-Status: HIT 并且我的源没有被调用,所以一切都很好!
但是,如果我再次点击 URL,这次使用带有第一次调用时收到的值的 If-Modified-Since 和 If-None-Match 标头,我会得到一个 304 Not Modified 和 X-Cache-Status: HIT,但仍然没有调用我的源服务器!
我似乎 Nginx 在其缓存中有内容,并与传入的标头一起计算它应该返回 304。这意味着如果内容在 Nginx 缓存中,我的来源永远不会返回 304。
我说的对吗?我找不到有关此行为的任何文档。但是,我在 Nginx 源代码中发现了一个似乎正在处理类似内容的模块:https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_not_modified_filter_module.c#L78
能否请您提供有关此行为、其工作原理以及在我的配置中启用它的原因的见解?
非常感谢!
【问题讨论】:
标签: nginx caching nginx-reverse-proxy http-status-code-304