考虑一个具有以下两个位置的 nginx 服务器,每个位置都提供一个 webapp,包括一些静态资源和一个 REST API。有没有办法缓存公共资源,例如,/proxy/host1/js/vendors.js
这样/proxy/host2/js/vendors.js
nginx 只从上游 webapp 服务器下载一次,并将其缓存以用于对不同主机vendors.js
的请求。vendors.js
location /proxy/host1 {
rewrite /proxy/host1/(.*) /$1 break;
proxy_pass http://host1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300;
proxy_connect_timeout 300;
}
location /proxy/host2 {
rewrite /proxy/host2/(.*) /$1 break;
proxy_pass http://host2;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300;
proxy_connect_timeout 300;
}
答案1
您可以使用指令修改nginx使用的缓存键proxy_cache_key
。
警告:在调整密钥之前,您需要详细了解缓存系统,因为不正确的设置可能会导致难以调试的问题。
例如,两个应该显示不同内容的单独 URL 始终显示其中一个 URL 的内容。
默认值为“proxy_cache_key $scheme$proxy_host$request_uri”;
您可以使用以下方式为密钥创建自定义 URI map
:
map $request_uri $cache_uri {
default $request_uri;
~ /js/vendors.js\?? /shared/vendors.js;
}
server {
proxy_cache_key "$scheme$proxy_host$cache_uri";
...
}
以上为所有包含字符串的 URImap
分配缓存键。/shared/vendors.js
/js/vendors.js?
这意味着对于所有此类 URL,缓存中都存储了一份副本。