Node.js用cluster模块启动多个进程后,React前端怎么连?

沐言 阅读 18

我用 Node.js 的 cluster 模块起了多个工作进程,但前端 React 应用发请求时老是连不上,或者偶尔 502。是不是端口没配对?我主进程监听的是 3001,前端代码里写死了这个端口:

useEffect(() => {
  fetch('http://localhost:3001/api/data')
    .then(res => res.json())
    .then(data => setData(data));
}, []);

但 cluster 启动后,每个 worker 都在同一个端口监听,理论上应该没问题啊?是我理解错了还是哪里漏了配置?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
予曦
予曦 Lv1
cluster 的理解没错,多个 worker 确实共享同一个端口,master 进程负责分发请求。502 和连不上的问题大概率是这几个原因:

第一,worker 进程挂了没重启。cluster 不会自动帮你重启挂掉的 worker,得自己监听 exit 事件。

第二,CORS 没配,浏览器直接拦了。

第三,代码报错导致 worker 频繁崩溃。

给你一个完整的示例,直接改一下就行:

const cluster = require('cluster');
const os = require('os');
const express = require('express');
const cors = require('cors');

if (cluster.isPrimary) {
const cpuCount = os.cpus().length;
console.log(主进程 ${process.pid} 启动,CPU核数: ${cpuCount});

for (let i = 0; i < cpuCount; i++) {
cluster.fork();
}

// worker 挂了自动重启,不然请求就 502 了
cluster.on('exit', (worker, code, signal) => {
console.log(worker ${worker.process.pid} 挂了,重启中...);
cluster.fork();
});
} else {
const app = express();

// CORS 必须配,不然前端跨域请求直接被浏览器干掉
app.use(cors({
origin: 'http://localhost:3000',
credentials: true
}));

app.use(express.json());

app.get('/api/data', (req, res) => {
res.json({
message: 'hello from worker',
pid: process.pid
});
});

app.listen(3001, () => {
console.log(worker ${process.pid} 监听 3001);
});
}


前端代码不用改,http://localhost:3001 是对的。cluster 模式下所有 worker 共享端口是内核级别的负载均衡,对前端透明。

再检查几个点:

确保装了 cors 包,npm install cors

看下控制台有没有 worker 频繁重启的日志,有的话就是代码里有 bug 导致崩溃。

如果用了 nginx 反向代理,记得检查 upstream 配置,不过你本地开发应该没这个。

调试的时候可以先把 worker 数量改成 1,确定没问题再开多进程。
点赞 1
2026-03-01 05:03