CentOS 上搭建 Node.js 集群的实用方案
一 环境准备与安装
- 系统要求:CentOS 7+,更新系统并安装基础工具:
- sudo yum update -y && sudo yum install -y curl wget
- 安装 Node.js(任选其一):
- 使用 NodeSource 仓库(示例为 Node.js 14.x):
- curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
- sudo yum install -y nodejs
- 或使用 EPEL 仓库:
- sudo yum install -y epel-release
- sudo yum install -y nodejs npm
- 验证版本:
- 安装进程管理器 PM2(全局):
二 方式一 使用 PM2 快速启用集群
- 启动集群:
- 启动并自动按 CPU 核心数 创建工作进程:pm2 start app.js -i max
- 指定实例数:pm2 start app.js -i 4
- 命名应用:pm2 start app.js -i max --name my-app
- 常用管理命令:
- 查看列表:pm2 list
- 查看日志:pm2 logs
- 监控资源:pm2 monit
- 启停与重启:pm2 stop|restart|delete <app_name_or_id>
- 配置文件方式(推荐用于生产):创建 ecosystem.config.js
- module.exports = {
apps: [{
name: ‘my-app’,
script: ‘app.js’,
instances: ‘max’,
exec_mode: ‘cluster’,
autorestart: true,
watch: false,
max_memory_restart: ‘1G’,
env: { NODE_ENV: ‘development’ },
env_production: { NODE_ENV: ‘production’ }
}]
};
- 启动:pm2 start ecosystem.config.js
- 生产环境启动:pm2 start ecosystem.config.js --env production
- 开机自启:
- 生成并启用开机启动脚本:pm2 startup,按提示执行输出的命令
三 方式二 使用 Node.js 内置 Cluster 模块
- 示例 app.js(多进程共享 3000 端口):
- const cluster = require(‘cluster’);
const http = require(‘http’);
const numCPUs = require(‘os’).cpus().length;
if (cluster.isMaster) {
console.log(
Master ${process.pid} is running);
for (let i = 0; i < numCPUs; i++) cluster.fork();
cluster.on(‘exit’, (worker) => console.log(worker ${worker.process.pid} died));
} else {
http.createServer((req, res) => {
res.writeHead(200, { ‘Content-Type’: ‘text/plain’ });
res.end(‘Hello World\n’);
}).listen(3000, () => console.log(Worker ${process.pid} started));
}
- 启动:node app.js
- 说明:主进程负责 fork 工作进程,工作进程共享监听端口,由操作系统进行连接分发(常见为轮询)
四 配置 Nginx 反向代理与多机负载均衡
- 安装 Nginx:sudo yum install -y nginx
- 单机多实例负载均衡(示例将请求分发到本机多个 Node 实例):
- http {
upstream myapp {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
- 多机横向扩展(示例将流量分发到多台服务器):
- upstream myapp {
server 192.168.1.11:3000;
server 192.168.1.12:3000;
server 192.168.1.13:3000;
}
- 应用与生效:
- 将应用分别部署在多台 CentOS 主机并启动(PM2 或 Cluster)
- 检查配置并重载 Nginx:sudo nginx -t && sudo systemctl reload nginx
五 高可用与运维要点
- 进程守护与自动恢复:
- 使用 PM2 的 autorestart、max_memory_restart、日志集中与监控(pm2 monit、pm2 logs),确保异常退出能自动拉起并快速定位问题
- 会话与有状态:
- 集群/多实例下避免依赖内存会话,建议使用 Redis 集中存储会话(如 connect-redis),保证粘滞无关与横向扩展一致性
- 优雅关闭:
- 处理 SIGTERM,停止接收新请求,完成在途请求后关闭服务器与数据库连接,减少中断
- 数据库与应用高可用:
- 数据库侧采用 MySQL 主从复制、MongoDB 副本集 等高可用方案,避免单点故障
- 监控与告警:
- 结合 Prometheus + Grafana 监控 QPS、延迟、内存、事件循环等,设置告警策略,配合 PM2 做进程级自愈
- 容器化与编排(进阶):
- 单机多副本可用 Docker Compose scale;多机生产级可用 Docker Swarm/Kubernetes,通过健康检查、滚动更新、资源限制与副本数实现高可用与弹性扩缩容