使用 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;;
}
我有一个托管在 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;;
}