我正在尝试在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/“
答案 0 :(得分:0)
这可能是由于您的负载均衡器未确定性地将请求映射到第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路径散列,所有这些问题都将消失。