0

我正在关注Ken Cochrane对Seamless deployment of Django to single server问题的回答。我基本上运行了两台生产服务器,一台primary和一台fallback,我的 nginx 配置如下(省略不必要的细节):

upstream app-primary {
    server localhost:12345;
    server localhost:12346 backup;
}
server {
    root /home/fraxtil/app/primary;
    location /static/ {
        alias /home/fraxtil/app/primary/static/;
    }
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app-primary;
    }
}

推送更新时,我升级fallback,然后关闭primary,升级,然后重新打开。解决方案几乎是完美的,但有一个问题:我正在使用 django-compressor 来收集和压缩我的 CSS 和 JS 文件,并且不能保证这两个实例具有相同的静态文件名。因此,当primary关闭时,fallback服务器可以很好地处理应用程序请求,但是 nginx 正在寻找静态文件/.../primary/static/而不是/.../fallback/static/.

有没有办法在不通过 Django 路由静态文件请求的情况下解决这个问题?或者,有没有更好的方法来无缝部署 Django 更新?(我对零停机时间很感兴趣,这就是两服务器模型吸引我的原因。)

4

1 回答 1

0

我找到了一种使用 try_files 指令使其工作的方法。在发布问题之前我实际上已经尝试过这个,但由于某种原因,我的第一次尝试使每个请求都是 404。这似乎有效,不过:

server {
    # Moved the root up one level
    root /home/fraxtil/app;
    location /static/ {
        # Try the primary instance's static folder, then the fallback's
        try_files /primary/$uri /fallback/$uri =404;
    }
...

这里唯一的缺点是所有对不存在的静态文件的请求都会两次访问磁盘,但这应该不是什么大问题。

于 2013-06-22T07:15:02.543 回答