温馨提示×

CentOS Node.js集群如何配置

小樊
35
2025-12-31 03:23:28
栏目: 编程语言

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
  • 验证版本:
    • node -v
    • npm -v
  • 安装进程管理器 PM2(全局):
    • sudo npm install pm2 -g

二 方式一 使用 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,通过健康检查、滚动更新、资源限制与副本数实现高可用与弹性扩缩容

0