在没有用户刷新nginx的情况下提供更新文件的正确方法

时间:2015-03-17 19:55:06

标签: django nginx gunicorn static-files

这是一个非常核心的问题。我有一个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/;
    }
}

1 个答案:

答案 0 :(得分:3)

您可以在nginx配置中为静态文件设置expire。例如,如果您不想缓存css,js和png文件。你可以定义......像:

location ~* \.(css|js|png)$ {
    expires 0;
    break;
}

所以他们不会被缓存。但是我假设您在更改存储库或开发人员的静态文件后正在制作./manage.py collectstatic。环境。