分享

小程序WebSocket通过F5无法转发问题解决

 liang1234_ 2020-02-14

本项目实现通过小程序实现语音通知功能,测试环境使用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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多