温馨提示×

Linux Node.js如何进行集群部署

小樊
39
2026-01-03 01:18:50
栏目: 编程语言

Linux Node.js 集群部署实战

一 核心原理与适用场景

  • 使用 Node.js 内置 cluster 模块 可创建多个 Worker 进程,由 Primary 进程统一管理,多个 Worker 可共享同一 TCP 端口,从而充分利用多核 CPU。
  • 连接分发有两种策略:
    1. 默认在 非 Windows 平台使用 round-robin(轮询),由 Primary 监听端口并分发连接;
    2. 由 Primary 创建监听句柄并下发给 Worker,Worker 直接 accept,理论上性能更好,但实际负载可能不均衡。
  • 适用:提升 并发吞吐容错(单 Worker 异常不影响整体服务)。不适用:需要强 进程内共享内存 的场景(此时考虑 worker_threads 或多进程架构改造)。

二 方案一 原生 Cluster 最小可用示例

  • 安装 Node.js(Ubuntu/Debian 示例,使用 NodeSource 仓库安装 Node.js 24.x):
    curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
    sudo apt-get install -y nodejs
    node -v  # 应输出 v24.x.x
    
  • 代码示例(cluster.js):
    import cluster from 'node:cluster';
    import http   from 'node:http';
    import { availableParallelism } from 'node:os';
    import process from 'node:process';
    
    const numCPUs = 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 (code=${code}, signal=${signal})`);
        // 简单自恢复:异常退出时重启
        cluster.fork();
      });
    } else {
      http.createServer((req, res) => {
        res.writeHead(200);
        res.end(`Hello from Worker ${process.pid}\n`);
      }).listen(8000, () => {
        console.log(`Worker ${process.pid} listening on 8000`);
      });
    }
    
  • 运行与验证:
    node cluster.js
    curl http://localhost:8000
    ps aux | grep node   # 应看到多个 node 进程
    
  • 要点:
    • 使用 cluster.isPrimary / isWorker 区分角色;
    • 通过 cluster.on(‘exit’) 做进程自愈;
    • 端口在多个 Worker 间共享,由内核/运行时分发连接。

三 方案二 使用 PM2 快速集群化

  • 安装与启动:
    sudo npm install -g pm2
    pm2 start app.js -i max        # 按 CPU 核心数启动 Worker
    pm2 status                    # 查看集群状态
    pm2 logs                      # 查看日志
    pm2 restart|stop app          # 重启/停止
    
  • 适用场景:需要 进程守护、日志聚合、一键扩缩容 的生产环境;PM2 在内部封装了 cluster 的启停与健康检查,运维成本低。

四 生产要点与常见问题

  • 无状态设计与共享数据:Node.js 不做请求路由,应用应尽量减少 内存会话 依赖;如需共享状态,使用 外部存储/缓存(如 Redis) 或消息队列。
  • 进程自恢复与零停机重启:监听 exit 事件重启异常 Worker;如需滚动升级,可采用 信号机制 逐一重启(如 SIGUSR2 触发的优雅重启流程),避免全量闪断。
  • 负载均衡策略选择:默认 round-robin 通常足够;若使用 “Worker 直接 accept” 模式,需评估实际连接分布是否均衡。
  • 健康检查与可观测性:暴露 /health 端点,结合日志与 进程监控(如 PM2 或系统监控)观察吞吐、延迟与 OOM。
  • 何时考虑多进程之外的方案:遇到 CPU 密集型 任务,优先用 worker_threads 或将计算卸载到独立服务;需要更强隔离与弹性时,考虑 容器化 + Kubernetes

0