温馨提示×

Ubuntu Nodejs 集群搭建方法是什么

小樊
51
2025-09-18 10:59:18
栏目: 编程语言

Ubuntu系统下搭建Node.js集群的常用方法

一、使用Node.js内置Cluster模块(原生方案)

Cluster模块是Node.js原生提供的多进程管理工具,允许主进程创建多个工作进程(Worker),所有工作进程共享同一个端口,通过操作系统的负载均衡(如Linux的Round-Robin算法)分发请求,充分利用多核CPU资源。

1. 基础环境准备

确保Ubuntu系统已安装Node.js和npm(Node.js包管理器)。若未安装,可通过以下命令快速安装:

sudo apt update
sudo apt install nodejs npm
# 验证安装
node -v  # 查看Node.js版本
npm -v   # 查看npm版本

2. 编写集群化应用代码

创建一个项目目录(如node-cluster-demo),初始化项目并编写集群配置代码:

mkdir node-cluster-demo && cd node-cluster-demo
npm init -y  # 初始化package.json

创建cluster-app.js文件,内容如下:

const cluster = require('cluster');
const http = require('http');
const os = require('os');

const numCPUs = os.cpus().length; // 获取CPU核心数

if (cluster.isPrimary) {
  // 主进程逻辑:创建工作进程
  console.log(`主进程 ${process.pid} 正在运行`);
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork(); // 创建子进程
  }

  // 监听工作进程退出事件,自动重启
  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 退出,正在重启...`);
    cluster.fork();
  });
} else {
  // 工作进程逻辑:创建HTTP服务器
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end(`响应来自工作进程:${process.pid}\n`);
  }).listen(3000);

  console.log(`工作进程 ${process.pid} 启动`);
}

3. 启动集群应用

在项目目录下运行以下命令启动集群:

node cluster-app.js

访问http://localhost:3000,多次刷新页面会发现响应来自不同的工作进程(PID不同),证明集群已生效。

4. 注意事项

  • 内存隔离:工作进程之间无法共享内存,需通过Redis、数据库等外部服务同步状态(如用户登录态、缓存数据)。
  • 进程守护:主进程需监听工作进程的exit事件,及时重启崩溃的进程,避免服务中断。
  • 进程数量:建议工作进程数量与CPU核心数一致,过多会导致上下文切换开销增大。

二、使用PM2进程管理器(推荐方案)

PM2是Node.js生态中最流行的进程管理工具,内置集群模式,支持负载均衡、日志管理、自动重启、零停机重启等功能,适合生产环境使用。

1. 安装PM2

通过npm全局安装PM2:

sudo npm install pm2 -g

2. 启动集群应用

有两种方式通过PM2启动集群:

  • 简单模式:直接指定实例数量(如4个):
    pm2 start app.js -i 4
    
  • 配置文件模式(推荐):创建ecosystem.config.js文件,定义集群配置:
    module.exports = {
      apps: [
        {
          name: 'my-node-app',       // 应用名称
          script: 'app.js',          // 入口文件
          instances: 'max',          // 实例数量(max表示CPU核心数)
          exec_mode: 'cluster',      // 集群模式
          autorestart: true,         // 自动重启
          watch: false,              // 不监听文件变化
          max_memory_restart: '1G',  // 内存超过1G时重启
          env: {
            NODE_ENV: 'development'  // 开发环境变量
          },
          env_production: {
            NODE_ENV: 'production'   // 生产环境变量
          }
        }
      ]
    };
    
    启动命令:
    pm2 start ecosystem.config.js
    

3. 常用管理命令

  • 查看所有进程:pm2 list
  • 查看进程详情:pm2 show <app_name_or_id>
  • 停止进程:pm2 stop <app_name_or_id>
  • 重启进程:pm2 restart <app_name_or_id>
  • 删除进程:pm2 delete <app_name_or_id>
  • 监控实时状态:pm2 monit(显示CPU、内存、日志)
  • 查看日志:pm2 logs(实时日志流)

4. 生产环境优化

  • 零停机重启:使用pm2 reload <app_name>代替restart,实现无缝重启。
  • 日志管理:通过pm2 logs --merge合并所有进程日志,或配置logrotate定期归档日志。
  • 开机自启动:运行pm2 startup生成启动脚本,确保服务器重启后自动启动PM2及应用。

三、搭配Nginx反向代理(增强生产环境能力)

虽然Cluster模块和PM2已能实现集群,但搭配Nginx可作为反向代理,提供负载均衡、SSL终止、静态文件缓存、限流等功能,进一步提升应用的可用性和安全性。

1. 安装Nginx

sudo apt update
sudo apt install nginx

2. 配置Nginx负载均衡

编辑Nginx配置文件(通常位于/etc/nginx/sites-available/default),添加以下内容:

http {
  upstream node_cluster {
    server 127.0.0.1:3000;  # Node.js集群地址(PM2启动的端口)
    server 127.0.0.1:3001;  # 若有多个实例,可添加更多
  }

  server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名

    location / {
      proxy_pass http://node_cluster;  # 转发到Node.js集群
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    }
  }
}

3. 重启Nginx

sudo systemctl restart nginx

4. 验证效果

访问http://your_domain.com,Nginx会将请求分发到后端的Node.js集群,提升并发处理能力和容错性。

0