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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:35:27