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

时间:2017-09-14 17:43:55

标签: amazon-web-services nginx socket.io 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           $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-aj1WgfGUyAAAJ'失败:WebSocket握手期间出错:意外响应代码:400

P.S Chrome的Frames标签我只能看到这个奇怪的消息:(Opcode -1)

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

更新。我打开了详细的日志记录,这里是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

也许有人会发现其中一些价值不正确,所以我很感激任何建议。

3 个答案:

答案 0 :(得分:4)

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

或者,如果使用CLI或API构建环境,则还可以使用应用程序负载均衡器(ALB)而不是经典负载均衡器(ELB)来重建ElasticBeanstalk应用程序,因为ALB也支持websockets。无法通过Web控制台使用此选项。

答案 1 :(得分:1)

另一种选择是仅使用“新应用程序”平衡器,该平衡器在运行Elasticbeanstalk时默认情况下不提供

可以使用新类型创建新环境,或尝试将经典平衡器迁移到Application(我通过干净的重新创建来实现)

创建后,再为端口443 HTTPS添加一个侦听器,所有内容即开即用。

克里斯

答案 2 :(得分:0)

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