Ubuntu系统下搭建Node.js集群的常用方法
Cluster模块是Node.js原生提供的多进程管理工具,允许主进程创建多个工作进程(Worker),所有工作进程共享同一个端口,通过操作系统的负载均衡(如Linux的Round-Robin算法)分发请求,充分利用多核CPU资源。
确保Ubuntu系统已安装Node.js和npm(Node.js包管理器)。若未安装,可通过以下命令快速安装:
sudo apt update
sudo apt install nodejs npm
# 验证安装
node -v # 查看Node.js版本
npm -v # 查看npm版本
创建一个项目目录(如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} 启动`);
}
在项目目录下运行以下命令启动集群:
node cluster-app.js
访问http://localhost:3000,多次刷新页面会发现响应来自不同的工作进程(PID不同),证明集群已生效。
exit事件,及时重启崩溃的进程,避免服务中断。PM2是Node.js生态中最流行的进程管理工具,内置集群模式,支持负载均衡、日志管理、自动重启、零停机重启等功能,适合生产环境使用。
通过npm全局安装PM2:
sudo npm install pm2 -g
有两种方式通过PM2启动集群:
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
pm2 listpm2 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(实时日志流)pm2 reload <app_name>代替restart,实现无缝重启。pm2 logs --merge合并所有进程日志,或配置logrotate定期归档日志。pm2 startup生成启动脚本,确保服务器重启后自动启动PM2及应用。虽然Cluster模块和PM2已能实现集群,但搭配Nginx可作为反向代理,提供负载均衡、SSL终止、静态文件缓存、限流等功能,进一步提升应用的可用性和安全性。
sudo apt update
sudo apt install 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;
}
}
}
sudo systemctl restart nginx
访问http://your_domain.com,Nginx会将请求分发到后端的Node.js集群,提升并发处理能力和容错性。