你的浏览器无法正常显示内容,请更换或升级浏览器!

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

tenfei
tenfei
发布于2026-08-22 12:19 阅读14次
Node.js 进程管理与守护配置实战指南
系统讲解 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 原生守护。核心三件事:崩溃重启、多核利用、日志管理。

2

0

文章点评
Copyright © from 2021 by namoer.com
458815@qq.com QQ:458815
蜀ICP备2022020274号-2