本項目實現(xiàn)通過小程序?qū)崿F(xiàn)語音通知功能,測試環(huán)境使用nginx轉(zhuǎn)發(fā)一切正常。
業(yè)務(wù)架構(gòu):
公網(wǎng)請求到總行F5----轉(zhuǎn)發(fā)到分行F5----分發(fā)到接入前置NGINX----分發(fā)到語音服務(wù)器
問題描述:
1. Websocket通道建立成功
2. 客戶端不能WebSocket消息轉(zhuǎn)發(fā)到服務(wù)器。
3. 服務(wù)器能夠WebSocket消息轉(zhuǎn)發(fā)到客戶端。
分析及解決過程
問題出現(xiàn)首先就是查看日志,通道wss://xxx.com/voice/websocket可以正常建立,客戶端發(fā)送消息到服務(wù)端進(jìn)行綁定時發(fā)送失敗。首先想到是nginx問題,檢查nginx配置參數(shù):
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';
}
參數(shù)正常。
第一步:
過濾掉總F5,分行F5進(jìn)行測試,一切正常。
問題原因總行F5 或者分行F5轉(zhuǎn)發(fā)導(dǎo)致不能收發(fā)消息。
第二步:
過濾掉總行F5,程序直連分行F5轉(zhuǎn)發(fā)到nginx接入前置測試,
問題重現(xiàn),說明分行F5配置有問題。
初步分析引起問題的原因:
Websocket 使用http協(xié)議來完成部分握手,這個http報文中有包含'Upgrade:websocket',這是要告訴服務(wù)器'我要切換協(xié)議'。服務(wù)器接收后,回復(fù)一個http報文,告訴客戶端'OK,我已經(jīng)切換到websocket協(xié)議了'。到此一切正常,客戶端發(fā)送商戶標(biāo)識到服務(wù)端進(jìn)行綁定,服務(wù)端沒有收到websocket消息,F(xiàn)5沒有識別到websocket協(xié)議轉(zhuǎn)發(fā)。
解決方案:
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