使用 nginx 和 Python 防止网站在更新期间关闭

Prevent site being down during updates using nginx and Python

我有一个托管在 Ubuntu 上的活动站点,使用 nginx,站点是用 Python 编写的(CherryPy 是服务器,Bottle 是框架)。

我有一个 shell 脚本,可以复制 python 我上传到现有实时站点的文件,这当然会导致 CherryPy 重新启动服务器,所以它是 运行 最新的代码(我想要它)。问题是,在它停止和启动之间,默认的静态页面会显示给当时试图查看网站页面的任何不幸的人(希望他们没有提交表格)。我在更新的时候看到这个页面很多次了。

我当前的设置是站点 运行 的两个副本,位于两个由 nginx 反向代理的端口上。所以我想如果我更新一个,等几秒钟,然后更新另一个,那么网站将在 100% 的时间内正常运行,但情况似乎并非如此?

假设我在端口 8095 和 8096 上有反向代理,它们都显示相同的站点,但在硬盘驱动器上有两个相同的副本。我更新了端口 8095 的 python 文件,这导致该端口在 CherryPy 重新启动时关闭。不是每个人都应该打8096吗?它似乎不是这样工作的。我的文件复制脚本有 8 秒的延迟,根据 CherryPy 日志,第 2 个在第 1 个已经完成重启后 6 秒停止重启,但我看到了服务器关闭时显示的默认静态离线页面。我很困惑。根据日志,始终有一个端口可用。

这是我的 nginx.conf 的一部分:

upstream app_servers {
    server 127.0.0.1:8095;
    server 127.0.0.1:8096;
}

server {
    server_name www.mydomain.com; 
    listen 80;

error_page 502 503 /offline/offline.html;

location /offline {
    alias   /usr/share/nginx/html/mysite/1/views/;
}

    location / {
            proxy_pass         http://app_servers;
            proxy_redirect     off;
            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_set_header   X-Forwarded-Host $server_name;
            proxy_set_header        X-Scheme $scheme;
            proxy_connect_timeout 10;
            proxy_read_timeout 10;
    }
}

试试这个:From the manual

upstream app_servers {
server 127.0.0.1:8095 max_fails=1 fail_timeout=1;
server 127.0.0.1:8096 max_fails=1 fail_timeout=1;;
}