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 class="hljs-title function_">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 - 停止进程:
pm2 stop - 重启进程:
pm2 restart - 删除进程:
pm2 delete - 监控实时状态:
pm2 monit(显示CPU、内存、日志) - 查看日志:
pm2 logs(实时日志流)
4. 生产环境优化
- 零停机重启:使用
pm2 reload代替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集群,提升并发处理能力和容错性。