我正在尝试在 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/