Bash

在生產中自動優雅地重新載入 gunicorn

  • April 20, 2020

我有一個自動部署工作流程,將程式碼推送到我的生產伺服器並觸發數據庫遷移、靜態文件更新等。問題是,gunicorn 不會在沒有開發選項的情況下自動重新載入程式碼更改--reload,他們建議不要在生產中使用。相反,指令是HUPmasterpid. 問題是,我不知道如何masterpid在自動腳本中檢索,儘管手動操作很容易。

如何materpid在 bash 腳本中檢索 gunicorn systemd 程序的值?

將以下內容添加到 systemd 服務文件中gunicorn,或將其添加為覆蓋:

ExecReload=/bin/kill -HUP $MAINPID

然後,您可以重新載入systemctl reload gunicorn.

編輯 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”。

引用自:https://serverfault.com/questions/823546