如果我向配置为缓存上游的 Nginx-proxy 服务器发出请求,我会收到以下响应标头:
{'content-length': '13200000', 'x-cache-status': 'MISS', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:57:55 GMT'}
几秒钟后,我再次执行相同的请求,得到以下标头:
{'content-length': '13200000', 'x-cache-status': 'HIT', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:58:18 GMT'}
上游服务器将 max-age 标头指定为 45 秒,第二个响应标头是否应该具有更新的 max-age 标头?即 max-age=45-(请求之间的时间)?
编辑
重现该行为的示例配置:
http {
include mime.types;
default_type application/octet-stream;
upstream backend {
server localhost:8080;
}
proxy_cache_path /etc/nginx/wwwroot/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
add_header X-Cache-Status $upstream_cache_status;
}
}
server {
listen 8080;
root /etc/nginx/wwwroot;
expires 60s;
}
}
结果:
root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:45 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: MISS
Accept-Ranges: bytes
root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:48 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: HIT
Accept-Ranges: bytes
答案1
在您的配置中,Nginx 只是一个反向代理。它不会重写任何内容,因为您没有告诉它重写任何内容。它只是存储上游服务器生成的页面,并在收到指示时传送这些页面。
上游服务器已设置过期时间,还有一个缓存控制,其最大使用期限为秒。我怀疑 Nginx 不会读取这些指令,而是按照您指示的时间将内容保留在其缓存中,但其他人可能会在这里纠正我。
我认为没有任何方法可以让 Nginx 跟踪上游服务器何时发送页面并在将页面传递给客户端之前重写页面的标头。这必须在应用服务器中完成。
Expires 是 http/1.0,cache-control 是 http/1.1,根据本文。您可以使用其中任意一种,但它们会发生冲突,因此我猜浏览器会在任意一种情况下刷新页面。
在我看来,你需要弄清楚你想要什么,然后配置你的应用服务器或 Nginx 来使用它。如果你有来自发行版的 headers_mod 模块,Nginx 可以重写 headers编译于。如果在某个时间之后页面不能被缓存,我建议您使用 Expires。如果您只是希望浏览器拥有相当新鲜的页面,那么 cache-control 更好,因为您可以定义诸如通过代理服务器和 CDN 进行缓存之类的内容。您始终可以让 Expires 指定时间,让 cache-control 指定 CDN 和代理缓存行为,包括重新验证。
建议多加思考和研究,剩下的问题你自己就能解决。有关缓存控制的有用参考。