Node.js用cluster模块启动多个进程后,React前端怎么连?
我用 Node.js 的 cluster 模块起了多个工作进程,但前端 React 应用发请求时老是连不上,或者偶尔 502。是不是端口没配对?我主进程监听的是 3001,前端代码里写死了这个端口:
useEffect(() => {
fetch('http://localhost:3001/api/data')
.then(res => res.json())
.then(data => setData(data));
}, []);
但 cluster 启动后,每个 worker 都在同一个端口监听,理论上应该没问题啊?是我理解错了还是哪里漏了配置?
根本原因
Node.js 的 cluster 工作模式是「主进程监听端口,多个 worker 共享处理请求」。你不能让每个 worker 都去 listen(3001),这会报 EADDRINUSE 或者只有第一个 worker 抢到端口,其他启动失败。
你遇到的 502 和连不上,大概率是请求被分发了,但 worker 进程没有正确接收处理。
正确的 cluster 写法
原理解释
cluster.isMaster 时,只有主进程执行 fork(),不调用 listen。
cluster.isWorker 时,worker 进程调用 server.listen(0),注意这里端口填 0,不是 3001!cluster 模块内部会拦截这个调用,让它绑定到主进程已经监听的端口上,请求会自动在 workers 之间轮询分发。
你之前写错的地方
这样写会导致主进程和 worker 抢端口,或者只有主进程能处理请求,worker 根本收不到。
前端代码没问题
你前端 fetch 的地址不用改,localhost:3001 对着主进程就行,cluster 会自动把请求分到各个 worker。
如果还有 502,检查一下 worker 进程里有没有未捕获的异常导致进程崩溃退出——这也是 cluster 模式下 502 的常见原因。
第一,worker 进程挂了没重启。cluster 不会自动帮你重启挂掉的 worker,得自己监听 exit 事件。
第二,CORS 没配,浏览器直接拦了。
第三,代码报错导致 worker 频繁崩溃。
给你一个完整的示例,直接改一下就行:
前端代码不用改,
http://localhost:3001是对的。cluster 模式下所有 worker 共享端口是内核级别的负载均衡,对前端透明。再检查几个点:
确保装了 cors 包,
npm install cors。看下控制台有没有 worker 频繁重启的日志,有的话就是代码里有 bug 导致崩溃。
如果用了 nginx 反向代理,记得检查 upstream 配置,不过你本地开发应该没这个。
调试的时候可以先把 worker 数量改成 1,确定没问题再开多进程。