Node.js 进程管理与守护配置实战指南

发布于2026-08-22 12:19 阅读14次 系统讲解 Node.js 生产环境进程管理与守护配置,涵盖 PM2 集群模式、systemd 守护、进程崩溃自动重启、日志管理、环境变量隔离和零停机部署等实战技巧,附完整配置示例。
# Node.js 进程管理与守护配置实战指南
## 前言
开发环境直接 `node app.js` 没问题,但生产环境必须考虑:进程崩溃了怎么办?怎么利用多核 CPU?怎么开机自启?本文系统讲解 Node.js 进程管理与守护的实战方案。
## 为什么需要进程管理
- Node.js 是单线程,一个进程只能用一个 CPU 核
- 进程崩溃不会自动重启
- 无法方便地查看日志、监控状态
- 部署、回滚、环境切换麻烦
## 方案一:PM2 集群模式
### 安装与基础使用
```bash
npm install -g pm2
# 启动(单实例)
pm2 start app.js --name my-app
# 集群模式(利用多核)
pm2 start app.js -i max --name my-app
# 查看状态
pm2 status
pm2 list
```
### 关键命令
```bash
# 查看日志
pm2 logs my-app
pm2 logs my-app --lines 100
# 查看监控
pm2 monit
# 重启/停止/删除
pm2 restart my-app
pm2 stop my-app
pm2 delete my-app
# 保存进程列表(开机自启)
pm2 save
pm2 startup
```
## 方案二:配置文件管理
用 ecosystem 配置文件统一管理多个应用:
```javascript
// ecosystem.config.js
module.exports = {
apps: [
{
name: "api",
script: "./server.js",
instances: "max",
exec_mode: "cluster",
env: {
NODE_ENV: "production",
PORT: 3000,
},
error_file: "./logs/err.log",
out_file: "./logs/out.log",
max_memory_restart: "500M",
},
],
};
```
```bash
# 用配置文件启动
pm2 start ecosystem.config.js
```
关键参数:
- `max_memory_restart`:内存超限自动重启,防内存泄漏拖垮
- `instances: "max"`:按 CPU 核数启动
- `error_file/out_file`:日志分离
## 方案三:systemd 守护
不想依赖 PM2,用系统自带的 systemd:
```ini
# /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js App
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
```
```bash
# 启用服务
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
# 查看状态
systemctl status myapp
journalctl -u myapp -f
```
`Restart=always` 保证崩溃自动重启,`RestartSec` 是重启间隔。
## 进程内优雅退出
```javascript
const server = app.listen(3000);
// 优雅关闭,处理完已有请求再退出
function gracefulShutdown(signal) {
console.log(`收到 ${signal},开始优雅退出`);
server.close(() => {
console.log("已关闭所有连接");
process.exit(0);
});
// 强制超时兜底
setTimeout(() => {
console.error("强制退出");
process.exit(1);
}, 10000);
}
process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
process.on("SIGINT", () => gracefulShutdown("SIGINT"));
```
## 环境变量隔离
```bash
# 用 .env 管理不同环境配置
# .env.production
# NODE_ENV=production
# DB_HOST=prod-db.example.com
# 启动时加载
NODE_ENV=production pm2 start app.js
```
```javascript
// 代码中按环境读取
const config = {
db: process.env.DB_HOST || "localhost",
port: process.env.PORT || 3000,
};
```
## 零停机部署
```bash
# PM2 reload 实现平滑重启
pm2 reload my-app
# 原理:先启动新进程,健康后再关闭旧进程
```
配合 CI/CD,实现:
```bash
# 部署脚本示例
git pull origin main
npm install --production
pm2 reload my-app
```
## 监控告警
```bash
# PM2 内置监控
pm2 monit
# 导出 JSON 状态
pm2 jlist
# 内存超限自动重启
pm2 start app.js --max-memory-restart 500M
```
## 小结
生产环境推荐 PM2(集群模式 + ecosystem 配置 + 开机自启),配合优雅退出和零停机 reload。对可靠性要求更高的场景,可以用 systemd 原生守护。核心三件事:崩溃重启、多核利用、日志管理。