优化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
上一篇和这篇都漏记录了一个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 拿到证书
客户端绑定
代码说明
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
心得
结合上一篇,已在架构上实现多台负载均衡,并且支持 wss协议
官网指导的部署方式
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: