使用带有弹性 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弹性beantalk上的nginx扩展

使用 AWS 弹性 beanstalk 负载均衡器在 Rails 上实施 https 连接

使用 CLI 将烧瓶应用程序部署到弹性 beanstalk 时出现 502 错误

带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk

将 sha 添加到 git commit 或弹性 beanstalk deploy

将 Node.js 应用程序部署到弹性 beanstalk