Linux systemd 服务管理:让 Node 应用开机自启

早期用 nohup node server.js & 启动服务,关 SSH 后虽然能跑,但服务器重启就失效,日志也散落各处。后来我把 Node 应用注册成 systemd 服务,彻底告别了这些麻烦。

1. nohup & 的局限

nohup 简单,但有几个硬伤:重启后不会自动运行;日志默认写 nohup.out,长时间运行会撑爆磁盘;不好管理环境变量;崩溃后只能手动重启。对于需要长期稳定运行的服务来说,远远不够。

2. 编写 xxx.service 文件

我在 /etc/systemd/system/ 下创建了 notes-app.service。关键字段:ExecStart=/usr/bin/node /var/www/app/server.js 指定启动命令,WorkingDirectory=/var/www/app 设置工作目录,Restart=always 和 RestartSec=2 保证异常退出后自动重启,Environment=NODE_ENV=production 注入环境变量。

3. enable 与 start 的区别

systemctl start notes-app 是立即启动,systemctl enable notes-app 是把服务加入开机启动项。两个都要执行:start 让当前运行起来,enable 让重启后自动运行。如果只 start 不 enable,服务器重启后服务不会自启。

4. journalctl 查日志

systemd 默认把 stdout/stderr 收到 journald 里。查实时日志用 journalctl -u notes-app -f,查最近 100 行用 journalctl -u notes-app -n 100。比翻找 nohup.out 方便太多,还可以按时间过滤。

5. 常见启动失败排查

最常见的是权限问题:systemd 以 root 运行但项目目录权限不足;其次是环境变量缺失,例如 NODE_ENV 没设导致配置加载错误;还有就是端口被占。排查顺序:先看 systemctl status notes-app 看退出码,再用 journalctl -u notes-app 看详细报错。

← 返回首页