生产环境Socket.io连接404问题求助(Express+React部署VPS)
Socket.io 部署后404问题解决指南
1. 先搞定Nginx配置(大概率是这里的问题)
Socket.io的请求需要特殊的反向代理规则,普通的HTTP路由转发不会处理它的长轮询和WebSocket协议。在你的Nginx server配置块里添加这段:
location /socket.io/ { proxy_pass http://localhost:你的Node服务端口; # 改成你实际用的端口,比如3000 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; }
添加完重启Nginx:sudo systemctl restart nginx
如果你的Socket.io用了自定义路径(比如不是默认的/socket.io),记得把location路径和服务端、客户端的配置统一。
2. 确认服务端Socket.io绑定正确
别把Socket.io直接挂到Express app上,必须绑定到Express用的HTTP服务器实例:
const express = require('express'); const app = express(); const httpServer = require('http').createServer(app); const io = require('socket.io')(httpServer); // 绑定到httpServer,不是app // 启动时要监听httpServer,不是app.listen httpServer.listen(3000, () => { console.log('服务跑在3000端口'); });
要是你设置了path选项(比如io(httpServer, { path: '/my-socket' })),客户端也要对应加上path: '/my-socket'。
3. 修正客户端连接配置
客户端直接连服务器的IP/域名就行,让Nginx帮你转发到Node服务,别直接连Node端口:
import { io } from 'socket.io-client'; const socket = io('http://server-ip', { transports: ['websocket', 'polling'], // 优先用WebSocket,不行再降级长轮询 path: '/socket.io/' // 服务端改了路径的话,这里同步改 });
4. 检查防火墙和服务状态
- 确认80/443端口是开放的(HTTP路由正常的话这步应该没问题,但还是确认下)
- 如果要直接连Node端口,得先开放端口:
sudo ufw allow 3000/tcp - 用
pm2 list看Node服务是不是在跑,pm2 logs看有没有报错日志
5. 测试服务端Socket.io是否正常
在服务器上用curl测一下:
curl http://localhost:3000/socket.io/?EIO=4&transport=polling
要是返回带sid、upgrades这些字段的内容,说明服务端没问题;还是404的话,就是服务端初始化错了。
内容的提问来源于stack exchange,提问作者Md Shayon
相关产品推荐
相关产品推荐

