gatewayworker 配置wss

发布时间 2023-04-18 16:47:03作者: 大尹

走过好几个坑,今天终于给配好了,首先是gatewayworker中的start_gateway.php 中,使用官方提供的wss方式,如下

$context = array(
    // 更多ssl选项请参考手册 https://php.net/manual/zh/context.ssl.php
    'ssl' => array(
        // 请使用绝对路径
        'local_cert' => '/www/server/panel/vhost/cert/xxx/fullchain.pem', // 也可以是crt文件
        'local_pk' => '/www/server/panel/vhost/cert/xxx/privkey.pem',
        'verify_peer' => false,
        'allow_self_signed' => true,   //如果是自签名证书需要开启此选项
    )
);
$gateway = new Gateway("websocket://0.0.0.0:442", $context);
// 开启SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';

  注意allow_self_signed这个选项一定要打开

然后就是对应的网站Nginx配置中添加如下

location /wss {
      proxy_pass https://127.0.0.1:442;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      rewrite /wss/(.*) /$1 break;
      proxy_redirect off;
    }

注意哈,这里最重要的一点就是proxy_pass https://127.0.0.1:442,查到csdn中的分享博客里写的全都是http,然后网页端死活连不上,终于多方查资料找到了问题所在。

最后HTML中连接websocket,这里注意一点,上面的nginx实际上是把域名+/wss给定向给了wss,所以连接的时候网址是wss://host/wss。这个也要细心一点

var websock = new WebSocket("wss://xxxx.test.com/wss");
        websock.onmessage = function(obj){
            console.log(obj)
        }
        websock.onopen = function(obj){
            console.log(obj)
        }
        websock.onclose = function(obj){
            console.log(obj)
        }