使用带有弹性 beanstalk、nginx 和 node.js 的 websocket 出现问题
Posted
技术标签:
【中文标题】使用带有弹性 beanstalk、nginx 和 node.js 的 websocket 出现问题【英文标题】:Issue using websocket with elastic beanstalk, nginx and node.js 【发布时间】:2015-01-09 02:24:08 【问题描述】:我正在尝试在 EB 上部署带有 sock.js 的 node.js 应用程序。 Websockets 在没有代理的情况下工作正常。使用 nginx 代理 ws 时出现连接问题。我附加了 .ebextensions/.config 文件:
files:
"/etc/nginx/conf.d/wssproxy.conf":
mode: "000644"
owner: root
content: |
map $http_upgrade $connection_upgrade
default upgrade;
'' close;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
Websockets 不工作,但 nginx 错误日志显示:
上游在读取上游时过早关闭连接,客户端:83.219.138.215,服务器:,请求:“POST x/XXXXX/432/2l4e2j6v/xhr_streaming HTTP/1.1”,上游:“http://xxx.0.0.1:8081/XXXXX/432/2l4e2j6v/xhr_streaming”,主机:“XXXXXX.elasticbeanstalk。 com", 推荐人: "http://XXXXXX.elasticbeanstalk.com/"【问题讨论】:
想知道你设法让它工作。我有类似的问题***.com/questions/27084124/… 【参考方案1】:这可能是因为您的负载均衡器未将请求确定性地映射到第 7 层 (HTTP) 和第 4 层 (websockets) 上的上游服务器。您会注意到您提供的错误消息显示您正在使用 xhr-streaming,它适用于第 7 层。我猜如果您仅强制使用 websocket 协议或仅使用 HTTP 轮询,这些错误将变得更加一致,但它们不会走开。
这里有一些可能的解决方案的更详细的解释。不幸的是,它们都很难实现。以下问题涉及到 socket.io,但由于您使用的是 sockjs,因此理想的解决方案更容易实现given sockjs' use of server-specific IDs in HTTP polling request paths。
Node socket.io on load balanced Amazon EC2
如果可以在 ELB 上使用确定性负载平衡方法,例如 IP 或 HTTP 路径散列,所有这些问题都会消失。
【讨论】:
以上是关于使用带有弹性 beanstalk、nginx 和 node.js 的 websocket 出现问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS 弹性 beanstalk 负载均衡器在 Rails 上实施 https 连接
使用 CLI 将烧瓶应用程序部署到弹性 beanstalk 时出现 502 错误
带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk