在多个位置块之间共享缓存

在多个位置块之间共享缓存

考虑一个具有以下两个位置的 nginx 服务器,每个位置都提供一个 webapp,包括一些静态资源和一个 REST API。有没有办法缓存公共资源,例如,/proxy/host1/js/vendors.js这样/proxy/host2/js/vendors.jsnginx 只从上游 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,缓存中都存储了一份副本。

相关内容