优化gateway支持wss协议

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

我的目标

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

服务器情况

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

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

上一篇和这篇都漏记录了一个bindUid 方法

public function bindUid 方法(Request $request){
    // 商家客户端进行绑定
    if("business" == $request["type"]){
    // $request["id"] = 商家绑定后台登入的手机号,且唯一
    Gateway::bindUid($request["client_id"],$request["id"]);
    }

    return json_encode([Gateway::getClientIdByUid($request['id'])]);
}

官方配置

内容来自: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 拿到证书

客户端绑定

代码说明
2new 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 

心得

结合上一篇,已在架构上实现多台负载均衡,并且支持 wss协议

官网指导的部署方式

workman官方部署wss方式

本作品采用《CC 协议》,转载必须注明作者和本文链接
朝着梦,踏平坎坷
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!