本项目实现通过小程序实现语音通知功能,测试环境使用nginx转发一切正常。
业务架构:
公网请求到总行F5----转发到分行F5----分发到接入前置NGINX----分发到语音服务器
问题描述:
1. Websocket通道建立成功
2. 客户端不能WebSocket消息转发到服务器。
3. 服务器能够WebSocket消息转发到客户端。
分析及解决过程
问题出现首先就是查看日志,通道wss://xxx.com/voice/websocket可以正常建立,客户端发送消息到服务端进行绑定时发送失败。首先想到是nginx问题,检查nginx配置参数:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
location /websocket {
proxy_pass http://192.168.10.191:7016/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
参数正常。
第一步:
过滤掉总F5,分行F5进行测试,一切正常。
问题原因总行F5 或者分行F5转发导致不能收发消息。
第二步:
过滤掉总行F5,程序直连分行F5转发到nginx接入前置测试,
问题重现,说明分行F5配置有问题。
初步分析引起问题的原因:
Websocket 使用http协议来完成部分握手,这个http报文中有包含"Upgrade:websocket",这是要告诉服务器"我要切换协议"。服务器接收后,回复一个http报文,告诉客户端"OK,我已经切换到websocket协议了"。到此一切正常,客户端发送商户标识到服务端进行绑定,服务端没有收到websocket消息,F5没有识别到websocket协议转发。
解决方案:
1.Log in to the BIG-IP Configuration utility.
2.Navigate to Local Traffic > iRules.
3.Click Create.
4.Give your new iRule a name and enter the following iRule in the Definition field:
when HTTP_REQUEST {
if { [string tolower [HTTP::header Upgrade]] contains "websocket" }{
HTTP::disable
}
}
5.Click Finished.
6.Assign the iRule to the virtual server
最后连接F5测试,一切OK
网友评论