nginx proxy_cache密钥哈希值更改每个其他浏览器请求

时间:2016-04-12 15:41:03

标签: caching nginx

我创建了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。

2 个答案:

答案 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 /下)将具有相同的内容,但名称不同。

同一问题:https://trac.nginx.org/nginx/ticket/1840