我创建了nginx的配置,如:
proxy_cache_path /tmp/nginx/static levels=1:2 keys_zone=static_zone:10m inactive=10d use_temp_path$
proxy_cache_key "$request_uri$args";
location ~* \.(css|gif|ico|jpe?g|js(on)?|png|svg|webp|ttf|woff|woff2|txt|map)$ {
proxy_hide_header Date;
proxy_cache_revalidate on;
proxy_pass http://static:8080;
proxy_cache_bypass $cookie_nocache $arg_nocache;
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
proxy_hide_header "Set-Cookie";
proxy_buffering on;
proxy_cache static_zone;
proxy_cache_valid 200 301 302 30m;
proxy_cache_valid 404 10m;
#expires max;
add_header X-Proxy-Cache $upstream_cache_status;
access_log off;
add_header Cache-Control "public";
add_header Pragma "public";
expires 30d;
log_not_found off;
tcp_nodelay off;
}
在Chrome首次请求时,所有工作都是例外x-proxy-cache:MISS其他请求来自磁盘缓存,标头为x-proxy-cache:HIT。刷新后它也是HIT。但是当我在这台机器上打开其他浏览器(Opera,Edge)的页面时,这个请求就是MISS。在文件系统中,nginx在同一内容上创建两个具有不同md5sum哈希值的文件。例如文件名438476ac40665c852d3acde1acf769f1 head:
^C^@^@^@^@^@^@^@/^V
W^@^@^@^@��^CW^@^@^@^@'^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:07:19 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes
第二个文件名a6f57423c2220fba3ada5f516f6dd91c具有相同的内容和这个头:
^C^@^@^@^@^@^@^@ ^V
W^@^@^@^@��^CW^@^@^@^@^A^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:06:41 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes
通过文档,文件名必须是密钥的md5,并且有 echo -n'/ js /catalog.js'| md5sum 是a6f57423c2220fba3ada5f516f6dd91c作为其中一个文件的名称(这是第一次请求)。我不想在每个用户浏览器中缓存服务器js | css。只需缓存一次,然后从缓存接收所有用户请求。附:我的网站使用https,http2,版本nginx 1.9.14。
答案 0 :(得分:3)
根据那里的 Vary:Accept-Encoding 标题,我猜想Edge和Opera会发送不同的" Accept-Encoding"请求的标头。例如,人们可以简单地发送" gzip"而另一个发送" gzip,deflate"。这些是技术上不同的Accept-Encoding 请求标头。
如果你知道原点不会发送有意义的不同编码,这些编码在浏览器之间无法工作,你可以添加:
proxy_ignore_headers Vary;
您已经拥有了proxy_ignore_headers,因此您可以添加它。
由于所有主流浏览器都支持gzip,因此风险可能非常低。然而," webp"也可以通过Accept-Encoding完成,这样如果原点可以处理webp,可能会为某些图像创建令人惊讶的结果。
答案 1 :(得分:1)
TLDR:请求标头Accept-Encoding
很重要。
考虑其正常值:Accept-Encoding: gzip, deflate, br
。
当您将其更改为Accept-Encoding: gzip, deflate, lolkek
时,Nginx会将缓存的响应存储在其他文件中。这2个文件(在/ var / cache / nginx /下)将具有相同的内容,但名称不同。