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集群,提升并發處理能力和容錯性。