oli*_*lif 5 nginx cache-control
如果我向配置为缓存上游的 Nginx 代理服务器发出请求,我会收到以下响应标头:
{'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'}
Run Code Online (Sandbox Code Playgroud)
几秒钟后,我再次执行相同的请求,得到以下标头:
{'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'}
Run Code Online (Sandbox Code Playgroud)
上游服务器将 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;
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
在你的配置中,Nginx 只是一个反向代理。它不会重写任何内容,因为您没有告诉它重写任何内容。它只是存储上游服务器生成的页面并在接到通知时传送它们。
上游服务器设置了过期时间,还有一个以秒为单位的最大年龄的缓存控制。我怀疑 Nginx 不会读取这些指令,并且只要您告诉它,就会将内容保留在其缓存中,但其他人可能会在这里纠正我。
我认为没有任何方法可以让 Nginx 跟踪上游服务器发送页面的时间并在将页面传递给客户端之前重写页面的标头。这必须在应用程序服务器中完成。
根据这篇文章,Expires 是 http/1.0,cache-control 是 http/1.1 。您可以使用其中任何一个,但它们会发生冲突,所以我猜浏览器会在任何一个告诉它时刷新页面。
恕我直言,你需要弄清楚你想要什么,然后配置你的应用程序服务器或 Nginx 来使用它。如果您的发行版中有 headers_mod 模块或在. 如果有一段时间页面一定不能被缓存的话我建议你使用Expires。如果您只是希望浏览器拥有相当新鲜的页面,那么缓存控制会更好,因为您可以通过代理服务器和 CDN 定义缓存等内容。您始终可以让 Expires 指定时间,让缓存控制指定 CDN 和代理缓存行为,包括重新验证。
建议更多的思考和研究,剩下的事情你就会自己解决。有关缓存控制的有用参考请参见此处。