CentOS 上搭建 Node.js 集群的实用方案
一 环境准备
- 安装 Node.js 与 npm(建议使用较新的 LTS 版本):
- 安装 EPEL 源后使用 yum 安装:sudo yum install -y epel-release && sudo yum install -y nodejs npm
- 验证版本:node -v、npm -v
- 准备示例应用(单文件即可,便于验证集群):
- 端口建议使用 3000/8000 等未被占用的端口
- 后续用 PM2 或 Nginx 对外暴露服务
二 方案一 使用 PM2 快速启用集群
- 全局安装 PM2:sudo npm install pm2 -g
- 启动集群(按 CPU 核心数):
- pm2 start app.js -i max
- 或指定实例数:pm2 start app.js -i 4
- 常用管理命令:
- 查看状态:pm2 status
- 查看日志:pm2 logs
- 重启/停止:pm2 restart / pm2 stop
- 生产常用配置(ecosystem.config.js):
- module.exports = { apps: [{ name: ‘api’, script: ‘./app.js’, instances: ‘max’, autorestart: true, max_memory_restart: ‘1G’, env: { NODE_ENV: ‘production’ } }] };
- 启动:pm2 start ecosystem.config.js
- 设置开机自启:pm2 startup(按提示完成系统服务注册)
三 方案二 使用 Node.js 内置 Cluster 模块
- 最小可用示例(cluster.js):
- const cluster = require(‘cluster’); const http = require(‘http’); const numCPUs = require(‘os’).cpus().length;
- if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) cluster.fork(); cluster.on(‘exit’, (w) => cluster.fork()); }
- else http.createServer((req,res)=>{ res.writeHead(200); res.end(‘hello\n’); }).listen(3000);
- 运行:node cluster.js
- 说明:
- 主进程负责 fork 工作进程,工作进程共享同一 TCP 端口
- 内置分发策略通常为 轮询(Round Robin),可结合业务特点选择更合适的策略
四 多实例负载均衡与高可用
- 使用 Nginx 作为反向代理与负载均衡器:
- 安装:sudo yum install -y nginx
- 配置示例(/etc/nginx/conf.d/node_app.conf):
- upstream node_app { server 127.0.0.1:3000; server 127.0.0.1:3001; server 127.0.0.1:3002; server 127.0.0.1:3003; }
- server { listen 80; location / { proxy_pass http://node_app; 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; } }
- 生效:sudo systemctl start nginx && sudo systemctl enable nginx
- 多机横向扩展:
- upstream 中写入多台后端 IP:端口,Nginx 自动分发请求,提高整体 可用性与吞吐
- 负载均衡算法可选 least_conn 等以适配不同访问特征
五 验证与运维要点
- 验证集群生效:
- 本地或远程访问:curl http://服务器IP:端口/,观察响应;多进程/多实例下请求会被分发到不同工作进程
- 进程守护与自动重启:
- 使用 PM2 的 autorestart、max_memory_restart 等策略,异常退出可自动拉起,缩短故障恢复时间
- 会话与有状态:
- 集群/多实例下建议使用 Redis 集中存储会话(如 express-session + connect-redis),避免单机粘滞与状态丢失
- 监控与日志:
- PM2:pm2 monit、pm2 logs;必要时接入 Prometheus/Grafana 做指标可视化与告警
- 数据库与应用依赖:
- 数据库建议配置 高可用(如 MySQL 主从、MongoDB 副本集),避免单点故障向上传导