生产运行
pm2、cluster 概念。
25 分钟
生产运行
本地 node app.js 不能代表生产:进程守护、多核利用、优雅退出、健康检查 需要 pm2 或容器编排配合。本课建立概念,深度调优见 nodejs-advanced-essentials。
学习目标
- 用 pm2 启动、重启、看日志
- 理解 Node cluster 与 pm2 cluster 模式的关系
- 配置健康检查与 graceful shutdown
pm2 基本用法
npm install -g pm2 # 或项目 devDependency
pm2 start src/server.js --name tracks-api
pm2 logs tracks-api
pm2 restart tracks-api
pm2 save && pm2 startup # 开机自启(Linux 服务器)
// ecosystem.config.cjs
module.exports = {
apps: [{
name: "tracks-api",
script: "src/server.js",
instances: "max", // cluster 模式占满 CPU
exec_mode: "cluster",
env: { NODE_ENV: "production", PORT: 3001 },
}],
};
pm2 start ecosystem.config.cjs
cluster 概念
Node 单线程事件循环;cluster / pm2 多实例 共享端口,由 OS 分发连接。适合 I/O 密集 API;CPU 密集任务应放 Worker 线程或独立服务。
| 模式 | 说明 |
|---|---|
| fork | 单实例,最简单 |
| cluster | 多进程同端口,吃满多核 |
| 容器 K8s | 多 Pod replicas,pm2 可只开 1 instance |
优雅退出
const app = await buildApp();
const close = async () => {
app.log.info("shutting down");
await app.close(); // 关连接池、停 accept
process.exit(0);
};
process.on("SIGINT", close);
process.on("SIGTERM", close);
K8s 滚动发布发 SIGTERM;必须在 deadline 内关完 DB 连接,否则脏断连。
与部署栈衔接
开发:node / vitest
单机:pm2 + Nginx 反代
容器:Dockerfile + HEALTHCHECK
编排:K8s liveness/readiness → /health
数据库连接串与密钥仍走 env;镜像构建见 docker-essentials。
练习
- 用 pm2 启动 Fastify 服务并
pm2 monit观察 - 实现
GET /health供负载均衡探测 - 发送 SIGTERM,确认日志出现 shutting down