Amazon web services AWS EB:WebSocket握手期间出错:意外响应代码:400

Amazon web services AWS EB:WebSocket握手期间出错:意外响应代码:400,amazon-web-services,nginx,socket.io,amazon-elastic-beanstalk,laravel-echo,Amazon Web Services,Nginx,Socket.io,Amazon Elastic Beanstalk,Laravel Echo,AWS上有一个Laravel/Vue.JS应用程序,它位于一个经典的负载平衡器(Elastic Beanstalk)后面,并通过Nginx内部代理到socket.io服务器。 SSL在Nginx上终止 这是nginx配置: location /socket.io { proxy_pass http://127.0.0.1:6001; proxy_http_version 1.1; proxy_set_header Upgrade

AWS上有一个Laravel/Vue.JS应用程序,它位于一个经典的负载平衡器(Elastic Beanstalk)后面,并通过Nginx内部代理到socket.io服务器。 SSL在Nginx上终止

这是nginx配置:

location /socket.io {
    proxy_pass          http://127.0.0.1:6001;
    proxy_http_version  1.1;
    proxy_set_header    Upgrade           $http_upgrade;
    proxy_set_header    Connection        "upgrade";
    proxy_set_header    Host $host;
    proxy_set_header    X-Real-IP         $remote_addr;
    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto $scheme;
}
目前,长轮询模式工作正常,但无法启动升级:

WebSocket连接到'wss://example.com/socket.io/?EIO=3&transport=websocket&sid=HmDFtq-AJ1WGFGUYAAJ'失败:WebSocket握手期间出错:意外响应代码:400

p.S Chrome的
框架
选项卡我只能看到这个奇怪的消息:
(操作码-1)

是否有人成功地使socket.io在AWS Elastic Beanstalk环境中工作?我只是浪费了两个星期来处理这个问题,如果有任何建议或想法,我将非常感激。谢谢

更新。我打开了详细日志记录,以下是Nginx中的变量:

$host example.com
$proxy_add_x_forwarded_for 134.xxx.xxx.xxx
$http_upgrade -
$remote_addr 172.31.10.208
$remote_user -
$server_name _
$upstream_addr 127.0.0.1:6001
$request GET /socket.io/?EIO=3&transport=polling&t=Lw26sYn&sid=6L5iHma-GJOeE3JQAAAX HTTP/1.1
$upstream_response_time 24.658 msec
$request_time 24.658

也许有人会发现其中一些值不正确,所以我希望得到任何建议。

您的ELB使用的是HTTP/HTTP侦听器还是TCP/SSL侦听器?WebSocket仅适用于后一种协议类型。将侦听器更改为TCP,它就会工作


或者,如果您使用CLI或API构建环境,还可以使用应用程序负载平衡器(ALB)而不是经典负载平衡器(ELB)重建ElasticBeanstalk应用程序,因为ALB还支持WebSocket。此选项不可通过web控制台使用。

另一个选项是只使用新的应用程序平衡器,在运行elasticbeanstalk时,默认情况下不会出现该平衡器

可以使用新类型创建新环境,或者尝试将经典平衡器迁移到应用程序(我使用clean recreate创建)

创建后,为端口443 HTTPS再添加一个侦听器,所有操作都是现成的


Chris

尝试在ElasicBeanStalk“软件”配置中从Apache代理服务器切换到Nginx。

删除
proxy\u set\u header Host$Host和test@TarunLalwani不幸的是,它不起作用。你在你的
6001
套接字服务器日志上看到了什么?据我所知,WSS请求甚至没有到达nginx,它被负载平衡器或其他东西阻止了…Classic ELB不支持WebSocket。谢谢,我会尝试一下,很快回来。我想我以前试过,但我会再试一次。很酷,它似乎可以工作,但仍然,其中一个实例(我有两个)有400个错误。您的方法是否适用于多个实例?是的,但在ELB上,您需要
启用粘性会话
禁用跨区域负载平衡
。其目的是确保HTTP和websocket请求都指向同一个实例。我没有测试用例设置来证明它是有效的,但请告诉我它是否有效,我会更新答案。粘性会话不能应用于TCP/SSL层,只能应用于HTTP。禁用跨区域负载平衡听起来不是一个好的解决方案,不是吗?是否应该另外配置ProxyProtocol?