Node.js 在 CentOS 上的集群搭建
一 环境准备与安装
- 建议使用 CentOS 7/8/Stream,更新系统并安装 EPEL 源:
- sudo yum update -y
- sudo yum install -y epel-release
- 安装 Node.js 与 npm(两种常用方式,二选一):
- 使用 NodeSource 仓库(示例为 Node.js 20.x):
- curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
- sudo yum install -y nodejs
- 或使用 nvm(灵活切换版本):
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
- source ~/.bashrc
- nvm install 20
- 验证安装:
- 可选:安装进程管理工具 PM2(便于生产环境管理):
二 方式一 使用 Node.js 内置 Cluster 模块
- 核心思路:由 Primary 进程监听端口并分发连接,Worker 进程处理请求;在 非 Windows 平台默认使用 轮询(round-robin) 分发,能更好地利用多核。
- 最小可用示例 server.js(使用 availableParallelism 获取并行度):
- const cluster = require(‘node:cluster’);
const http = require(‘node:http’);
const os = require(‘node:os’);
const numCPUs = os.availableParallelism();
if (cluster.isPrimary) {
console.log(
Primary ${process.pid} is running);
for (let i = 0; i < numCPUs; i++) cluster.fork();
cluster.on(‘exit’, (worker, code, signal) => {
console.log(worker ${worker.process.pid} died);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end(Hello from worker ${process.pid}\n);
}).listen(8000);
console.log(Worker ${process.pid} started);
}
- 运行与验证:
- node server.js
- curl http://127.0.0.1:8000(多请求可见不同 worker 响应)
- 重要说明与建议:
- 进程角色判断请使用 cluster.isPrimary(新代码推荐),同时存在 cluster.isMaster 仅为兼容旧版。
- 分发策略默认 轮询;另一种“由 worker 直接 accept”的方式在实践中负载可能不均衡,需谨慎评估。
- 不要依赖进程内的 内存状态(如 session),多进程间不共享内存;必要时使用 Redis 等外部存储。
- 按需实现 监控与自动重启(如监听 ‘exit’ 事件并 fork 新 worker)。
三 方式二 使用 PM2 快速集群化
- 安装与启动:
- sudo npm install -g pm2
- pm2 start app.js -i max
- 常用命令:pm2 list、pm2 logs、pm2 restart/stop/delete 、pm2 monit
- 开机自启(按提示完成系统服务注册):
- 说明:
- -i max 会按 CPU 核心数 启动等量的工作进程,适合大多数 HTTP/API 服务;也可指定固定实例数(如 -i 4)。
四 反向代理与多实例扩展
- 使用 Nginx 作为反向代理与负载均衡(HTTP/HTTPS 场景推荐):
- 安装:sudo yum install -y nginx
- 配置示例(/etc/nginx/conf.d/node_app.conf):
- upstream node_app {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
server 127.0.0.1:8004;
}
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
}
}
- 生效:sudo systemctl enable --now nginx
- 多实例端口规划建议:
- 若单实例监听 8000,可启动多个实例分别监听 8001–8004,由 Nginx 统一对外暴露 80/443。
- 容器化扩展(可选):
- 使用 Docker 与 Docker Compose 扩缩容实例(replicas),配合 Nginx 或 Kubernetes Ingress 做服务暴露与负载均衡。