在 nginx 上无需用户刷新即可提供更新文件的正确方法
Proper way to serve updated files without user refreshing on nginx
这是一个很核心的问题。我有一个 Django 应用程序,我在 nginx/gunicorn 配置中 运行。 Nginx负责代理到gunicorn,但也直接服务于项目的静态文件。
问题是,当我更新静态文件时,浏览器没有加载最新版本。有时刷新修复它,但有时它需要清除缓存。 (我应该提到我正在使用 require.js,这没有帮助)。
为了缓解这个问题,我采用了以下技巧:
VERSION = '2.03'
STATIC_URL = '/static/' + VERSION + '/'
STATIC_ROOT = BASE_DIR + '/static/' + VERSION + '/'
这样,当我更改静态文件时,我只需修改版本即可。但由于种种原因,我需要停止这样做。有没有办法配置 nginx 以在更新的静态文件可用时更好地提供它们?
我只是不确定是浏览器还是 nginx 造成的。
更新: 这是我的 nginx 配置,删除了注释:
upstream mycoolsite_server {
server unix:/webapps/mycoolsite/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name www.mycoolsite.com;
return 301 http://mycoolsite.com$request_uri;
}
server {
listen 80;
server_name mycoolsite.com 42.42.42.42;
client_max_body_size 4G;
access_log /webapps/mycoolsite/logs/nginx-access.log;
error_log /webapps/mycoolsite/logs/nginx-error.log;
location /static/ {
alias /webapps/mycoolsite/site/static/;
}
location /media/ {
alias /webapps/mycoolsite/site/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://mycoolsite_server;
break;
}
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /webapps/mycoolsite/site/static/;
}
}
您可以在nginx配置中为静态文件设置过期时间。例如,如果您不想缓存 css、js 和 png 文件。你可以定义某事。喜欢:
location ~* \.(css|js|png)$ {
expires 0;
break;
}
所以它们不会被缓存。但是我假设您在更改存储库或开发人员上的静态文件后正在制作 ./manage.py collectstatic 。环境。
这是一个很核心的问题。我有一个 Django 应用程序,我在 nginx/gunicorn 配置中 运行。 Nginx负责代理到gunicorn,但也直接服务于项目的静态文件。
问题是,当我更新静态文件时,浏览器没有加载最新版本。有时刷新修复它,但有时它需要清除缓存。 (我应该提到我正在使用 require.js,这没有帮助)。
为了缓解这个问题,我采用了以下技巧:
VERSION = '2.03'
STATIC_URL = '/static/' + VERSION + '/'
STATIC_ROOT = BASE_DIR + '/static/' + VERSION + '/'
这样,当我更改静态文件时,我只需修改版本即可。但由于种种原因,我需要停止这样做。有没有办法配置 nginx 以在更新的静态文件可用时更好地提供它们?
我只是不确定是浏览器还是 nginx 造成的。
更新: 这是我的 nginx 配置,删除了注释:
upstream mycoolsite_server {
server unix:/webapps/mycoolsite/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name www.mycoolsite.com;
return 301 http://mycoolsite.com$request_uri;
}
server {
listen 80;
server_name mycoolsite.com 42.42.42.42;
client_max_body_size 4G;
access_log /webapps/mycoolsite/logs/nginx-access.log;
error_log /webapps/mycoolsite/logs/nginx-error.log;
location /static/ {
alias /webapps/mycoolsite/site/static/;
}
location /media/ {
alias /webapps/mycoolsite/site/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://mycoolsite_server;
break;
}
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /webapps/mycoolsite/site/static/;
}
}
您可以在nginx配置中为静态文件设置过期时间。例如,如果您不想缓存 css、js 和 png 文件。你可以定义某事。喜欢:
location ~* \.(css|js|png)$ {
expires 0;
break;
}
所以它们不会被缓存。但是我假设您在更改存储库或开发人员上的静态文件后正在制作 ./manage.py collectstatic 。环境。