AWS EB:WebSocket 握手期间出错:意外响应代码:400
AWS EB: Error during WebSocket handshake: Unexpected response code: 400
有一个 Laravel/Vue.JS 应用托管在 AWS 上,位于 Classic Load Balancer (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 connection to 'wss://example.com/socket.io/?EIO=3&transport=websocket&sid=HmDFtq-aj1WgfGUyAAAJ' failed: Error during WebSocket handshake: Unexpected response code: 400
P.S 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
也许有人会发现其中一些值不正确,因此我将不胜感激任何建议。
您的 ELB 使用 HTTP/HTTP 听众还是 TCP/SSL 听众? Websockets 仅适用于后一种协议类型。将侦听器更改为 TCP,它将起作用。
或者,如果您使用 CLI 或 API 构建环境,您还可以使用应用程序负载均衡器 (ALB) 而不是 Classic Load Balancer (ELB) 重建 ElasticBeanstalk 应用程序,因为 ALB 也支持网络套接字。此选项无法通过 Web 控制台使用。
另一种选择是仅使用 在 运行 elasticbeanstalk
时默认不会出现的新应用程序平衡器
可以用新类型创建一个新环境,或者尝试将经典平衡器迁移到应用程序(我用 clean recreate 做到了)
创建后,再为端口 443 HTTPS 添加一个侦听器,一切都开箱即用。
克里斯
尝试在 ElasicBeanStalk "Software" 配置中从 Apache 代理服务器切换到 Nginx。
有一个 Laravel/Vue.JS 应用托管在 AWS 上,位于 Classic Load Balancer (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 connection to 'wss://example.com/socket.io/?EIO=3&transport=websocket&sid=HmDFtq-aj1WgfGUyAAAJ' failed: Error during WebSocket handshake: Unexpected response code: 400
P.S 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
也许有人会发现其中一些值不正确,因此我将不胜感激任何建议。
您的 ELB 使用 HTTP/HTTP 听众还是 TCP/SSL 听众? Websockets 仅适用于后一种协议类型。将侦听器更改为 TCP,它将起作用。
或者,如果您使用 CLI 或 API 构建环境,您还可以使用应用程序负载均衡器 (ALB) 而不是 Classic Load Balancer (ELB) 重建 ElasticBeanstalk 应用程序,因为 ALB 也支持网络套接字。此选项无法通过 Web 控制台使用。
另一种选择是仅使用 在 运行 elasticbeanstalk
时默认不会出现的新应用程序平衡器可以用新类型创建一个新环境,或者尝试将经典平衡器迁移到应用程序(我用 clean recreate 做到了)
创建后,再为端口 443 HTTPS 添加一个侦听器,一切都开箱即用。
克里斯
尝试在 ElasicBeanStalk "Software" 配置中从 Apache 代理服务器切换到 Nginx。