痛点

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 取代上面所有方案。