Ubuntu

通過 nginx 為 Flask 創建一個 systemd 服務

  • January 9, 2017

我正在通過 nginx 在伺服器上執行 Flask 應用程序。我想創建一個 systemd 文件,這就是我所擁有的:

[Unit]
Description=my123 website
After=syslog.target
Requires=postgresql.service

[Service]
ExecStart=/home/user_123/my_web_app/run.py &
ExecStop=
Restart=on-abort
WorkingDirectory=/home/user_123/my_web_app/
SyslogIdentifier=my_web_app
User=user_123

[Install]
WantedBy=multi-user.target

在本地,我將其執行為./run.py. 現在,我應該在ExecStartand中有ExecStop什麼?我認為ExecStart是正確的,因為我有&它。但是怎麼樣ExecStop

不,你永遠不應該添加&ExecStart. 這將使 systemd 認為您的單元是進行分叉的程序。此外,您不需要ExecStop了解 SIGTERM 的服務(flask 的內置網路伺服器可以),systemd 知道將信號發送到哪裡。

即 systemd 跟踪ExecStart開始的 PID,然後在您要求終止程序時知道將 SIGTERM 發送到哪裡。

(一個單元type=可以使分叉比這複雜一點。但預設單元type=認為沒有分叉。)

額外的

在 Nginx 後面執行內置的燒瓶伺服器將使您非常容易受到即使是微不足道的 DoS 攻擊。燒瓶內置伺服器不適合生產使用。使用 Nginx,您應該使用類似uWSGI的東西。

Flask 文件有一個關於 uwsgi 的部分,您可以輕鬆映射命令行以編輯 uWSGI 配置文件選項。uWSGI 文件有一個關於 systemd 的部分。你真的應該使用 systemd 來啟動一個類似於 uWSGI 的真正的網路伺服器,而不是燒瓶內置的。

引用自:https://unix.stackexchange.com/questions/335883