AWS EC2部署的Node.js Socket.io无法与Amplify React应用连接(本地正常)
问题排查与解决方案
1. 协议不匹配(核心问题)
后端部署了SSL证书,说明服务走HTTPS协议,但客户端用的是ws://(对应HTTP的WebSocket),协议不匹配必然导致连接失败。改成wss://即可:
// 客户端修正代码 socket.current = io(`wss://${process.env.REACT_APP_SOCKET_URL}`); // 或者更省心:直接传入HTTPS地址,Socket.io会自动适配协议 socket.current = io(process.env.REACT_APP_SOCKET_URL);
2. 端口配置检查
- SSL证书常规绑定443端口,而非80端口。确认EC2安全组开放了443端口,且后端服务确实监听443。
- 如果硬要在80端口跑HTTPS,属于非常规配置,容易引发协议混淆,建议调整为443端口。
3. CORS与跨域验证
- 确认
process.env.FrontEnd_URL已正确设置为Amplify应用的完整域名(比如https://xxx.amplifyapp.com),且服务端能正常读取这个环境变量。 - 可以临时把
origin设为"*"测试是否是CORS问题(生产环境别这么用),如果测试能连,再回头排查环境变量配置:
const io = require("socket.io")(server, { autoConnect: false, cors: { origin: "*", // 临时测试用 credentials: true, }, });
4. 服务端HTTPS服务器配置
确保服务端是基于HTTPS创建的,不是HTTP。用Express的示例配置:
const fs = require("fs"); const https = require("https"); const express = require("express"); const { Server } = require("socket.io"); const app = express(); // 加载SSL证书文件 const options = { key: fs.readFileSync("/path/to/你的私钥.pem"), cert: fs.readFileSync("/path/to/你的证书.pem"), }; const server = https.createServer(options, app); const io = new Server(server, { autoConnect: false, cors: { origin: process.env.FrontEnd_URL, credentials: true, }, }); server.listen(443, () => { console.log("HTTPS服务运行在443端口"); });
5. 轮询400错误补充排查
除上述问题外,400错误还可能源于:
- EC2如果挂了负载均衡/NAT网关,需确保配置里开启了WS/WSS的转发支持
- 服务端未正确初始化Socket.io,或监听路径不匹配
内容的提问来源于stack exchange,提问作者Hassan Akhlaq
相关产品推荐
相关产品推荐

