在一台 VPS 上运行自己的后端服务(如 Go、Node.js、Python Web 项目)时,你一定会遇到这样一个问题:
“怎么让服务长期运行、断电/重启后自动恢复、出错后能自动拉起?”
这就涉及到守护进程(Daemon)管理工具的选型问题。在实际部署中,常见的三大方案包括:
systemd
(原生系统服务管理器)supervisord
(轻量进程管理器)pm2
(Node.js 起家,但支持各种进程)本文将带你逐个对比它们的适用场景、配置方式与优缺点,并给出实战推荐。
部署在 VPS 上的 Web 后端服务需要满足以下特性:
如果你直接运行:
一旦你关闭终端、网络中断或 VPS 重启,服务就挂了。这种方式根本无法用在生产环境。
工具 | 来源生态 | 是否跨语言 | 重启机制 | 开机自启 | 日志集中管理 | 安装成本 |
---|---|---|---|---|---|---|
systemd | Linux 系统自带 | ✅ 是 | ✅ 支持 | ✅ 支持 | ✅ journalctl | 已集成 |
supervisord | Python 起源 | ✅ 是 | ✅ 支持 | ✅ 支持 | ✅ 支持日志输出 | 需安装 |
pm2 | Node.js 起源 | ✅ 是 | ✅ 支持 | ✅ 支持 | ✅ 支持日志输出 | 需安装 |
注意:这三者都是通用的守护工具,并不仅限于特定语言。只要你的服务是“命令行可运行的”,都可以用它们管理。
systemd
:系统级别守护进程(推荐用于生产)Linux 的现代服务管理器,几乎所有 VPS 系统都自带。
优点:
journalctl
查看缺点:
systemctl daemon-reload
适用场景: 中大型项目,长期运行服务,追求稳定性、资源占用最小,推荐使用。
supervisord
:轻量进程守护框架起源于 Python 社区,实质是一个通用的“进程调度器”。
优点:
缺点:
apt install supervisor
)适用场景: 适合管理多个后台服务(如 Web + Worker + Scheduler),适合开发者中小型项目。
pm2
:Node.js 世界的进程守护工具起初是为 Node.js 而生,但已经支持任意可执行文件。
优点:
缺点:
npm install -g pm2
)适用场景: 适合开发阶段频繁调试和重启、Node.js 项目、单用户部署小项目。
systemd
示例(推荐)# /etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
ExecStart=/root/myapp
WorkingDirectory=/root
Restart=on-failure
User=root
Environment=ENV=production
[Install]
WantedBy=multi-user.target
启动服务:
systemctl daemon-reload
systemctl start myapp
systemctl enable myapp
supervisord
示例# /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/root/myapp
directory=/root
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
启用配置:
supervisorctl reread
supervisorctl update
supervisorctl start myapp
pm2
示例npm install -g pm2
# 运行二进制服务
pm2 start ./myapp --name myapp
# 设置开机自启
pm2 startup
pm2 save
场景 | 推荐工具 | 理由 |
---|---|---|
生产环境 / 单服务 | systemd | 稳定、原生、资源占用低 |
多进程服务 / 多语言项目 | supervisord | 简单统一管理多个程序,轻量灵活 |
集群服务 | pm2 | CLI 友好、支持 cluster、热重启、日志丰富 |
不论你用 Go、Node.js、Python 还是其他语言,只要你在 VPS 上运行后端服务,都应当选用 稳定的守护进程工具,确保服务可靠运行。
延伸阅读: