用 systemd 跑 Python 小服务的几点心得
让 Python 服务开机自启、崩溃自拉、日志可查,其实不需要 PM2 和 Supervisor,系统自带的 systemd 就够。
跑几个 Python 小服务,其实不一定要装进程守护工具,systemd 几行配置就够了。
一个够用的 unit 模板
[Unit]
Description=My App
After=network.target
[Service]
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp.env
ExecStart=/opt/myapp/venv/bin/gunicorn -b 127.0.0.1:8000 wsgi:app
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
几条实践心得
Restart=always:进程崩了 3 秒后自动拉起,半夜也能睡个好觉。EnvironmentFile:密钥和路径放独立的环境文件里,权限设为 600,不混在代码仓库。- 虚拟环境写绝对路径:
/opt/myapp/venv/bin/gunicorn,避免环境变量带来的意外。 - 日志交给 journal:应用只管往 stdout 打日志,用
journalctl -u myapp -f查看,不用自己折腾日志轮转。 - 改完记得两连:
systemctl daemon-reload然后restart,多数"怎么没生效"都卡在第一句。
顺手加一层保护
如果是长期跑的服务,可以再加几句加固:
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/lib/myapp
文件系统只开放真正需要写的目录,出了问题也能少疼一点。
工具不在多,在于用透。systemd 这类"自带"的东西,往往是被低估的那一个。
✳
谢谢你读到这里。