痛点
node app.js 一开 SSH 就跑,断开连接进程就死。nohup ... & 又粗糙:宕了不重启、日志难管、开机不启动。
要的是进程管理器:开机自启、宕了自动拉起、日志归一处、能 reload 不断连接。
方案 A:systemd(推荐 · Linux 自带)
写一个 /etc/systemd/system/myapp.service:
[Unit]
Description=My App
After=network.target
[Service]
Type=simple
User=wadely
WorkingDirectory=/home/wadely/myapp
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
操作:
sudo systemctl daemon-reload
sudo systemctl enable --now myapp # 启用 + 立即启动
sudo systemctl status myapp
sudo systemctl restart myapp
sudo journalctl -u myapp -f # 看日志
sudo journalctl -u myapp --since "1 hour ago"
优点:系统自带、日志统一进 journal、和其他服务平等 缺点:每加一个服务写一个 unit 文件
方案 B:PM2(Node 项目首选)
npm install -g pm2
pm2 start server.js --name myapp
pm2 list
pm2 logs myapp
pm2 restart myapp
pm2 monit # 终端实时面板
pm2 startup # 配置开机自启(按提示一行命令)
pm2 save # 保存当前进程列表
优点:开箱即用、自带集群模式(-i max)、监控面板
缺点:只 Node 友好;非 Node 用着不舒服
ecosystem 配置(推荐):
// ecosystem.config.js
module.exports = {
apps: [{
name: "myapp",
script: "server.js",
instances: "max", // 集群模式,每核一个
exec_mode: "cluster",
env: { NODE_ENV: "production", PORT: 3000 },
}]
};
pm2 start ecosystem.config.js 一行起。
方案 C:supervisor(Python 友好)
sudo apt install supervisor
/etc/supervisor/conf.d/myapp.conf:
[program:myapp]
command=/home/wadely/myapp/.venv/bin/python app.py
directory=/home/wadely/myapp
user=wadely
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
environment=PORT=3000
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
怎么选
| 场景 | 用 |
|---|---|
| 任何 Linux 服务(推荐默认) | systemd |
| 纯 Node 项目 + 想要面板 | PM2 |
| 多个 Python 后台脚本 | supervisor |
| 容器化部署 | docker compose(下一篇) |
下一篇:用 Docker 取代上面所有方案。