在生产环境中自动优雅地重新加载 gunicorn

在生产环境中自动优雅地重新加载 gunicorn

我有一个自动部署工作流,它将代码推送到我的生产服务器并触发数据库迁移、静态文件更新等。问题是,如果没有开发选项,gunicorn 不会自动重新加载代码更改--reload,他们建议不要在生产中使用开发选项。相反,指令是向发送信号HUPmasterpid问题是,我不知道如何masterpid在自动脚本中检索,尽管手动执行很容易。

如何materpid在 bash 脚本中检索 gunicorn systemd 进程的值?

答案1

将以下内容添加到 systemd 服务文件中gunicorn,或将其添加为覆盖:

ExecReload=/bin/kill -HUP $MAINPID

然后您可以使用 重新加载systemctl reload gunicorn

答案2

有关编辑 gunicorn 服务文件的更详细说明(基于@jordanm 的回答):

编辑您的服务文件/etc/systemd/system/my_task.service或类似路径

[Unit]
Description=My task running runicorn
After=network.target

[Service]
User=my_user
# [...]
ExecStart=/home/my_user/my_task/.venv/bin/gunicorn --workers 3 --bind unix:my_task.sock -m 007 wsgi:app
ExecReload=/bin/kill -HUP $MAINPID # <------ add this line

[Install]
WantedBy=multi-user.target

保存,然后运行以下命令重新加载配置

sudo systemctl enable my_task

然后,您可以运行以下命令来正常重启 gunicorn 服务(这应该在您的部署脚本中运行)

sudo systemctl reload my_task gunicorn restart

如果不运行该systemctl enable my_task命令,可能会出现以下错误:

无法重新加载 my_task.service:作业类型重新加载不适用于单元 my_task.service。有关详细信息,请参阅系统日志和“systemctl status my_task.service”。

答案3

我已经为类似问题创建了一个答案这里。与接受的答案相比,这可能是一个更简单的解决方案,特别是在gunicorn未在系统范围内安装的情况下。

如果链接不起作用

下面一行代码完美地完成了工作:

kill -HUP `ps -C gunicorn fch -o pid | head -n 1`

解释

pc -C gunicorn仅列出带有命令的进程gunicorn,即 worker 和掌握过程。工人是掌握如下所示ps -C gunicorn fc -o ppid,pid,cmd。我们只需要掌握,因此h使用 flag 删除第一行,即 PID 文本。请注意,fflag 确保master打印在 worker 上方。

正确的程序是HUP只向掌握。这样就gunicorn优雅地重启了,只有工人被重新创造,而不是主人

相关内容