在 Ubuntu 上用 Node.js 开启集群(Cluster),本质是利用 Node.js 自带的 cluster 模块,让多个进程共享同一个端口,从而充分利用多核 CPU。
下面从 基础示例 → 生产建议 → PM2 方式 逐步说明。
新建文件 server.js:
const cluster = require('cluster');
const http = require('http');
const os = require('os');
// 主进程
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
console.log(`Master ${process.pid} is running`);
// 根据 CPU 核心数 fork 子进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker) => {
console.log(`Worker ${worker.process.pid} died`);
cluster.fork(); // 自动重启
});
} else {
// 工作进程
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from worker ' + process.pid + '\n');
}).listen(3000);
console.log(`Worker ${process.pid} started`);
}
node server.js
访问:
curl http://localhost:3000
你会看到不同 pid 的响应,说明集群已生效。
nohup node server.js &
创建服务文件:
sudo nano /etc/systemd/system/node-cluster.service
内容示例:
[Unit]
Description=Node Cluster App
After=network.target
[Service]
ExecStart=/usr/bin/node /home/ubuntu/server.js
Restart=always
User=ubuntu
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl start node-cluster
sudo systemctl enable node-cluster
sudo npm install -g pm2
pm2 start server.js -i max
或指定进程数:
pm2 start server.js -i 4
pm2 list
pm2 logs
pm2 restart all
pm2 stop all
pm2 startup
pm2 save
✅ Cluster 只适合 CPU 密集型 或 多请求并发
✅ 子进程之间 不共享内存
✅ 如果有 session,需用 Redis 等外部存储
✅ WebSocket / Socket.io 需启用 sticky sessions
| 方式 | 适合场景 |
|---|---|
| cluster 模块 | 学习 / 自定义控制 |
| systemd | 原生服务管理 |
| PM2 | 生产环境首选 |
如果你愿意,我可以:
告诉我你的使用场景即可。