我有一个通过 Gunicorn 运行的 WSGI Python 应用程序:
CONFIG = {
'bind': "unix:{}".format(os.path.join(RUN_DIR, "brain.sock")),
'preload_app': False,
# supervisord requires that the child process runs in foreground
'daemon': False,
...
}
它通过套接字文件从 Nginx 接收 HTTP 请求:
server {
...
location / {
proxy_pass http://unix:$root/run/brain.sock:;
...
}
Gunicorn 通过 Supervisord 运行:
[program:myapp]
command = venv/bin/gunicorn -c gunicorn.conf.py myapp.wsgi:application
...
我正在考虑一种无需停机和等待即可部署应用程序的方法。每个工作人员最多可能需要 30 秒才能填满缓存。
我的部署想法如下:
使用新代码启动第二个 Gunicorn,它将监听另一个套接字文件。
等到应用程序启动并且所有缓存都已填满。
重命名套接字文件以指向 Nginx 使用的位置。Nginx 仍会向旧套接字发送请求。
关闭带有旧应用程序版本的旧 Gunicorn。Nginx 将看到套接字已关闭,并将从同一位置重新打开一个新套接字。
这能行吗?
我是不是又在重新发明轮子了?
答案1
那是蓝绿部署模式。
无需重命名套接字(步骤 3),您可以拥有两个 nginx 配置(具有不同名称的站点文件或服务器指令),蓝色和绿色,指向您的每个 gunicorn 实例。然后,当您想要部署时,只需启用一个并禁用另一个。最后nginx 重新加载将妥善处理所有活动连接。
以下是一个例子的那个。