带有 ALB 和 Socket.IO 的 AWS ElasticBeanstalk 上的 HTTP 400 错误
HTTP 400 Error on AWS ElasticBeanstalk with ALB and Socket.IO
我有一个 Elastic Beanstalk 环境,在 Node.js 实例上设置了 Application Load Balancer (ALB),该实例同时为 REST API 和 Socket.IO 连接提供服务。
当 EC2 实例的数量多于一个时,Socket.IO 个连接中的某些连接失败并显示 HTTP 400。只有一个实例时,同样的问题已解决。
我还尝试在 ALB 中启用粘性会话,并且还创建了一个连接到 ElasticCache 中的 Redis 实例的 Redis 适配器。
无法找出导致这些 HTTP 400 错误的原因。
Socket.IO 文档 https://socket.io/docs/v2/using-multiple-nodes/
最终不得不使用网络负载均衡器 (NLB) 解决了这个问题。
经过两天的研究,我找到了解决方案。
使用传输“websocket”而不是“polling”(默认)。
服务器:
const io = require('socket.io')(http, {
cors: {
origin: '*'
},
transports: ['websocket']
})
客户:
import io from 'socket.io-client'
socket = io('wss://your_url/', {
transports: ['websocket']
})
我有一个 Elastic Beanstalk 环境,在 Node.js 实例上设置了 Application Load Balancer (ALB),该实例同时为 REST API 和 Socket.IO 连接提供服务。
当 EC2 实例的数量多于一个时,Socket.IO 个连接中的某些连接失败并显示 HTTP 400。只有一个实例时,同样的问题已解决。
我还尝试在 ALB 中启用粘性会话,并且还创建了一个连接到 ElasticCache 中的 Redis 实例的 Redis 适配器。
无法找出导致这些 HTTP 400 错误的原因。
Socket.IO 文档 https://socket.io/docs/v2/using-multiple-nodes/
最终不得不使用网络负载均衡器 (NLB) 解决了这个问题。
经过两天的研究,我找到了解决方案。 使用传输“websocket”而不是“polling”(默认)。
服务器:
const io = require('socket.io')(http, {
cors: {
origin: '*'
},
transports: ['websocket']
})
客户:
import io from 'socket.io-client'
socket = io('wss://your_url/', {
transports: ['websocket']
})