我正在通过 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
.现在, ExecStart
and中应该有什么ExecStop
?我认为ExecStart
是正确的,因为我有它&
。但又如何呢ExecStop
?
答案1
不,你应该绝不添加。&
ExecStart
这将使 systemd 认为您的单元是进行分叉的进程。另外,您不需要ExecStop
理解 SIGTERM 的服务(flask 的内置网络服务器可以),systemd 知道将信号发送到哪里。
即 systemd 跟踪开始的 PID ExecStart
,然后知道当您要求终止进程时向何处发送 SIGTERM。
(一个单元type=
可以使分叉比这更复杂一些。但默认单元type=
认为没有分叉。)
额外的
在 Nginx 后面运行内置的 Flask 服务器将会呈现你非常甚至容易受到微不足道的 DoS 攻击。 Flask 内置服务器不适用于生产用途。对于 Nginx,你应该使用类似的东西uWSGI。
Flask 文档有一个关于 uwsgi 的部分,并且您可以轻松映射命令行来编辑uWSGI配置文件选项。 uWSGI 文档有一个关于 systemd 的部分。你真的应该使用 systemd 来启动一个类似于 uWSGI 的真正的网络服务器,而不是内置的 Flask。