温馨提示×

Node.js在CentOS上的集群搭建

小樊
31
2025-12-21 19:06:03
栏目: 编程语言

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
  • 验证安装:
    • node -v
    • npm -v
  • 可选:安装进程管理工具 PM2(便于生产环境管理):
    • sudo npm install -g 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
  • 开机自启(按提示完成系统服务注册):
    • pm2 startup
  • 说明:
    • -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
  • 容器化扩展(可选):
    • 使用 DockerDocker Compose 扩缩容实例(replicas),配合 Nginx 或 Kubernetes Ingress 做服务暴露与负载均衡。

0