You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理下React+Node.js项目Socket.io连接失败如何解决

问题根因与修复方案

你报错的核心问题有两个:

  • 客户端实际请求的地址是http://localhost:9000,线上用户浏览器访问时本地没有运行Socket服务,自然报连接拒绝
  • 报错的请求路径是/socket.io/,和你前后端配置的/socketio不符,说明前端打包的是未修改path配置的旧代码

1. 修复前端Socket连接代码

不要写死服务端IP,使用相对路径自动适配当前部署的域名、协议,同时明确指定传输顺序:

import { io } from "socket.io-client";

let socket = io({
    path: '/socketio',
    transports: ['websocket', 'polling']
});

export default socket;

修改后重新执行React项目build命令,把新生成的build文件替换到/root/my-app/build目录。


2. 修正Nginx配置

你的Socket.io反向代理配置缺必要的头信息和缓存跳过规则,修改/etc/nginx/sites-available/react的location /socketio块如下:

location /socketio {
    proxy_pass http://localhost:9000;      
    include proxy_params;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;      
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_cache_bypass $http_upgrade;
}

修改后先验证配置正确性:
sudo nginx -t
返回success后重载配置生效:
sudo systemctl reload nginx


3. 验证后端服务状态

执行以下命令确认pm2托管的后端服务正常运行:
pm2 status
如果服务状态不是online,执行pm2 logs查看报错信息排查问题。
在服务器本地执行curl命令验证Socket服务可正常访问:
curl http://localhost:9000/socketio/?EIO=4
正常会返回类似0{"sid":"xxx","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}的响应。


4. 最终测试

清空浏览器缓存后重新访问页面,即可正常连接Socket.io。


内容的提问来源于stack exchange,提问作者Leonardo López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:06:04