我使用 Nginx 来提供静态文件(同时也用作我的 NodeJS express RestAPI 的反向代理)。问题是当我将新的 git 提交推送到服务器时,用户仍将获得旧的(最新修订版)文件。目前的解决方法是用户清除浏览器中的缓存。
这可能是什么原因?我猜这是服务器端缓存配置错误?请参阅下面的我的 nginx 配置(基本 + 包含)。
如下所示,静态文件(.html、.js、.css)位于 /var/www/frontend 下
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
listen 80;
server_name **REMOVED_FOR_PRIVACY_REASONS**;
proxy_cache_valid 404 1m;
location / {
root /var/www/frontend;
index index.html
try_files try_files $uri $uri/ =404;
#proxy_cache backcache;
#proxy_cache_bypass $http_cache_control;
#add_header X-Proxy-Cache $upstream_cache_status;
}
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
答案1
我也认为这与客户端缓存有关。
我将使用 firebug 或类似程序开始调试它,加载页面并检查缓存标头(etag / last-modified / cache-control / expires)。
当我们讨论这个问题时,我发现这个关于 HTTP 缓存的文档非常好:
https://www.mnot.net/cache_docs/
尽管如此,它还是由制定 HTTP 标准的人之一制作的。
答案2
我认为这不是服务器端缓存配置错误。静态文件由浏览器自动缓存。您需要某种静态文件版本控制来强制浏览器读取您修改过的源:
<link src="/static/style.css?v=xxxx">
<script language="javascript" type="text/javascript" src="/js/app.js?v=xxxx"></script>
答案3
除了其他答案之外,请查看哈希破坏者,一个用 Python 编写的工具,用于解决此类问题。描述如下:“hashbuster 是一个用于添加将缓存破坏查询字符串转换为 URL在您的 HTML 文件中。
如果您对实时网站进行了大量更改,浏览器和代理缓存可能是您的祸根。如果您曾经不得不告诉客户清除浏览器缓存才能看到您最新的代码推送,那么 hashbuster 就是您的最佳选择。
您可以通过以下方式调用该工具git post-receive 钩子在您的服务器上。