gatewayworker 配置wss
走过好几个坑,今天终于给配好了,首先是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) }