4

在经典负载均衡器(Elastic Beanstalk)后面的 AWS 上托管了一个 Laravel/Vue.JS 应用程序,并通过 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

PS Chrome 的Frames标签我只能看到这条奇怪的消息:(Opcode -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

也许有人会发现其中一些值不正确,因此我将不胜感激。

4

3 回答 3

10

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

或者,如果您使用 CLI 或 API 构建您的环境,您也可以使用 Application Load Balancer (ALB) 而不是 Classic Load Balancer (ELB) 重新构建您的 ElasticBeanstalk 应用程序,因为 ALB 还支持 websocket。此选项无法通过 Web 控制台使用。

于 2017-09-20T05:59:32.050 回答
2

另一种选择是仅使用运行 elasticbeanstalk 时默认不提供的新应用程序平衡器

可以使用新类型创建新环境或尝试将经典平衡器迁移到应用程序(我使用干净的重新创建)

创建后,再为端口 443 HTTPS 添加一个侦听器,一切都开箱即用。

克里斯

于 2019-07-04T08:42:14.703 回答
-1

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

于 2020-05-21T21:09:53.933 回答