node.js - 将 websocket 与 Elastic beanstalk、nginx 和 node.js 结合使用时出现问题

标签 node.js nginx websocket amazon-elastic-beanstalk sockjs

我正在尝试在 EB 上使用 sock.js 部署 node.js 应用程序。 Websocket 无需代理即可正常工作。使用 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/

最佳答案

这可能是由于您的负载均衡器无法确定地将请求映射到第 7 层 (HTTP) 和第 4 层(websockets)上的上游服务器。您会注意到您提供的错误消息显示您正在使用 xhr-streaming,它在第 7 层上工作。我猜测,如果您仅强制使用 websocket 协议(protocol)或仅 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 路径哈希),所有这些问题都将消失。

关于node.js - 将 websocket 与 Elastic beanstalk、nginx 和 node.js 结合使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883498/

相关文章:

django - 使子域读取父域 session

websocket - Jetty:如何保护 web.xml 中的 websocket 连接?

mysql - 如何向 Sequelize 模型添加大量数据?

javascript - 使用 .each() 从 JS 对象中获取特定项目

Docker Compose 与 NGINX 代理传递不起作用

java - 无法连接到我的 tomcat 8 websocket

php - Laravel echo 不接收事件

javascript - 在 node.js 中提供 HTML 文件

javascript - Node.js:将 base64 编码的图像响应为 JSON

php - Nginx 下载 php 而不是运行它