优化gateway支持wss协议

全屏阅读
  • 基本信息

代码备份录 —— workman-gateway 支持 ssl 遇到的问题,以及解决方式

目标

支持ssl 协议,使得小程序能使用

服务器情况

测试服:公网IP 55.55.55.55  内网IP:192.168.1.1 【通过nginx实现】

通过官方指导配置,在gateway内配置ssl相关内容
负载均衡(服务器A和B已通过阿里云slb 做了负载均衡,并已监听443端口)
服务器A :公网IP 66.66.66.61  内网IP:192.168.0.1
服务器B :公网IP 99.99.99.91  内网IP:192.168.0.2

官方配置

内容来自:start_gateway.php 文件部分内容

// 证书最好是申请的证书
$context = array(
    // 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
    'ssl' => array(
        // 请使用绝对路径
        'local_cert'                 => 'ssl/*****.pem', // 也可以是crt文件
        'local_pk'                   => 'ssl/*****.key',
        'verify_peer'               => false,
        // 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
    )
);
// 原先是这里监听了7373端口,此处注释掉,改为443端口
//$gateway = new Gateway("Websocket://0.0.0.0:7373");

// websocket协议(端口任意,只要没有被其它程序占用就行)
$gateway = new Gateway("websocket://0.0.0.0:443", $context);
// 开启SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';

****其他不变****

使用 nginx 配置

    1、启动gateway 监听websocket 端口 7373
    2、nginx 配置反向代理,转到7373端口 【域名都是测试服的域名,证书一致】

    核心nginx配置
    map  $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    upstream websocket { 
        server 66.66.66.61:7373; #当前服务器的IP
    }
    server
    {
        ****
        #SSL-END
        location /wss
        {
                proxy_pass http://66.66.66.61:7373;#当前服务器的IP
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header X-Real-IP $remote_addr;
        }
    }

域名绑定

添加记录
1、domain.com ==正常解析到第一台ip==> 66.66.66.61
2、申请 domain.com => ssl 拿到证书

客户端绑定

代码说明
2、new wss协议
启动ws链接
onopen
{"type":"init","client_id":"c0a8a0cc090800000007"}
收到workman返回的client_id,准备绑定laravel
开始绑定client_id
绑定成功 [Array(1)]

<script type="text/javascript">

    var ws;
    var client_id ;

    function connect() {
        // 此处的domain.com 是指向register的那台服务器(上方服务器有记录)
        ws = new WebSocket("wss://domain.com");
        ws.onopen = onopen;
        ws.onmessage = onmessage;
        ws.onclose = function() {
            console.log("连接关闭,定时重连");
            connect();
        };
        ws.onerror = function() {
            console.log("出现错误");
        };
    }
    function onmessage(e) {
        console.log("服务端推送",e.data);
        var data = JSON.parse(e.data);
        client_id = data['client_id'];
        switch(data['type']){
            // 绑定 client_id
            case 'init':
                // 客户端ID绑定
                console.log("收到workman返回的client_id,准备绑定laravel");
                loginInit(data);
                break;
            // 服务端 ping 客户端
            case 'ping':
                ws.send('{"type":"ping"}');
                break;
        }
    }
    function loginInit(data) {
        $.ajax({
            url:"api/wss/bindUid",
            type: "post",
            data:{
                id:"business",
                type:"business",
                client_id:data['client_id']
            },
            cache:false,
            dataType: "json",
            beforeSend:function(XMLHttpRequest){
                console.log("开始绑定client_id");
            },
            success:function(pay){
                console.log("绑定成功",pay);
            },
            error: function (XMLHttpRequest,ex) {
            }
        });
    }
    function onopen() {

    } 
    setTimeout(function () {
        console.log("启动ws连接");
        connect();
    },1000);
</script>

遇到的问题,放在最后

nginx 反向代理到websocket端口,也是用的http 

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!