无法通过Google Cloud应用负载均衡器建立WebSocket连接求助
Google Cloud全球外部应用负载均衡器WebSocket连接故障排查
环境设置
- 一台VM实例运行两个服务:
- 认证服务(Authentication Service):端口
8080,可通过https://auth.forge-code.com访问。 - 通知服务(Notification Service):端口
8081,可通过https://notify.forge-code.com访问。
- 认证服务(Authentication Service):端口
- 通知服务暴露WebSocket端点
/ws/*(例如wss://notify.forge-code.com/ws/546)。 - 全球外部应用负载均衡器配置:
- 前端(Frontend):
- 协议:HTTPS
- HTTP保持连接超时:1200秒
- 已为
auth.forge-code.com、notify.forge-code.com两个子域名配置SSL证书。
- 路由规则(Routing Rules):
auth.forge-code.com所有流量路由至auth-backend。notify.forge-code.com/ws/*流量路由至notify-backend。notify.forge-code.com其他流量路由至notify-backend。
- 后端(Backends):
auth-backend:- 端口:8080
- 超时:30秒
notify-backend:- 端口:8081
- 超时:30秒
- 已启用Cloud CDN
- 已启用日志(采样率:1)
- 前端(Frontend):
- DNS已正确将两个子域名解析至负载均衡器IP。
问题详情
https://notify.forge-code.com/health等HTTP请求完全正常。wss://notify.forge-code.com/ws/546的WebSocket连接失败:- Postman返回
502 Bad Gateway - 浏览器控制台偶尔出现
socket hang up错误
- Postman返回
- 直接连接后端
ws://34.133.145.146:8081/ws/546可成功建立WebSocket连接。
补充信息
- 后端服务基于Rust的
ntex框架实现,日志显示通过负载均衡器发起的WebSocket连接刚建立就被断开。 - 怀疑问题出在后端到负载均衡器的回传流量环节,但不确定调试方向。
日志信息
后端日志片段
[INFO ntex::web::middleware::logger] 35.191.206.16:41366 "GET /health HTTP/1.1" 200 47 "-" "GoogleHC/1.0" 0.000069 [INFO notify_service::services::websocket_service] Client disconnected: 546 [INFO notify_service::services::websocket_service] Connection dropped, stopping heartbeat task.
1. Postman连接wss://notify.forge-code.com/ws/546
- 错误:
502 Bad Gateway - 请求:
GET /ws/546 HTTP/1.1 Host: notify.forge-code.com Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: x14nFpQQ/RYw17KRaAYteA== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- 响应:
HTTP/1.1 502 Bad Gateway Content-Length: 110 Content-Type: text/plain Connection: close Via: 1.1 google Date: Wed, 18 Dec 2024 10:50:58 GMT Alt-Svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000
2. 直接连接后端ws://34.133.145.146:8081/ws/546
- 请求:
GET /ws/546 HTTP/1.1 Host: 34.133.145.146:8081 Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: HBB28rJBqzubIZpcjX4IFQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- 响应:
HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: BMDxeu6H/GzSXaTDwL4/gunqy1A= Date: Wed, 18 Dec 2024 10:51:19 GMT
3. Postman连接ws://notify.forge-code.com/ws/546
- 错误:
socket hang up - 请求:
GET /ws/546 HTTP/1.1 Host: notify.forge-code.com Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: KgravwbL2GoTBZkgHj1uFQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- 无响应
备注
- 不存在
400错误。 - 已提供完整日志及握手详情。
问题
- 为何通过负载均衡器的WebSocket连接失败,但HTTP流量和直接连接后端的WebSocket连接正常?
- 如何解决该问题,使通过负载均衡器的WebSocket连接能够成功建立?
内容的提问来源于stack exchange,提问作者Shivank Anchal
相关产品推荐
相关产品推荐

