优雅的 Web 应用程序重新加载

优雅的 Web 应用程序重新加载

我有一个通过 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 秒才能填满缓存。

我的部署想法如下:

  1. 使用新代码启动第二个 Gunicorn,它将监听另一个套接字文件。

  2. 等到应用程序启动并且所有缓存都已填满。

  3. 重命名套接字文件以指向 Nginx 使用的位置。Nginx 仍会向旧套接字发送请求。

  4. 关闭带有旧应用程序版本的旧 Gunicorn。Nginx 将看到套接字已关闭,并将从同一位置重新打开一个新套接字。

这能行吗?

我是不是又在重新发明轮子了?

答案1

那是蓝绿部署模式

无需重命名套接字(步骤 3),您可以拥有两个 nginx 配置(具有不同名称的站点文件或服务器指令),蓝色和绿色,指向您的每个 gunicorn 实例。然后,当您想要部署时,只需启用一个并禁用另一个。最后nginx 重新加载将妥善处理所有活动连接。

以下是一个例子的那个。

答案2

除了 gunicorn,你还可以看看uwsgi, 哪个

旨在开发用于构建托管服务的完整堆栈。

应用服务器(用于各种编程语言和协议)、代理、进程管理器和监视器都是使用通用 API 和通用配置样式实现的。

由于其可插入式架构,它可以扩展以支持更多平台和语言。

目前,您可以用 C、C++ 和 Objective-C 编写插件。

名称中的“WSGI”部分是为了向同名的 Python 标准致敬,因为它是该项目开发的第一个插件。

多功能性、性能、低资源使用率和可靠性是该项目的优势(也是唯一遵循的规则)。

它的一个特点是优雅地重新加载

相关内容