微信小游戏的域名只支持 https (wx.request、wx.uploadFile、wx.downloadFile) 和 wss (wx.connectSocket) 协议;所以我们的服务器打算使用nginx反向代理https/wss。
准备
准备好域名,并且经过ICP备案
配置管理后台
在小游戏后台设置服务器的socket合法域名,把我们与服务器通讯的地址加进去
注意:域名必须经过 ICP 备案;
配置服务器
1.首先申请Https证书,阿里云有免费的可以先购买使用(域名类型:单域名; 证书类型:dv ssl; 加密等级:免费版)
2.拿到证书后绑定我们之前准备好的域名
3.选择nginx证书下载,可以对证书重命名后准备使用
4.服务器安装nginx
5.打开nginx的配置文件 nginx.conf,找到443所在的server块进行配置
# 新增login_addr块
upstream login_addr {
server 127.0.0.1:20013 weight=1;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name xxxx; # 这里配置你的域名
root /usr/share/nginx/html;
# 把你下载的证书上传到服务器,并且指定路径
ssl_certificate "/etc/nginx/ssl/server.crt"; # 根据你的证书路径设置
ssl_certificate_key "/etc/nginx/ssl/server.key"; # 根据你的证书路径设置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# 设计思想:nginx对我们来说只是一个转发的功能,但为了对登录做一个负载均衡,
# 所以决定把与login的通讯和base的通讯区分开,给出的方案是修改客户端登录的连接信息
# 通过请求信息来决定如何转发
# 服务器对应的配置就有了下面俩个块 /loginapp 和 /baseapp
location /loginapp {
# 指定我们上面定义的地址,摘出来的目的是为了负载均衡
proxy_pass http://login_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
# 由于KBEngine的baseapp本身就是负载均衡的,所以对baseapp,主需要原样转发即可
# 我目前只使用了一台机器,所以这里转发的地址是 127.0.0.1
location /baseapp {
proxy_pass http://127.0.0.1:$arg_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
6.重启nginx
客户端适配
1.修改客户端js插件
// 修改 getServerAddr 函数
// 修改的结果是如果不启动wss连接,地址保持不变
// 如果启动wss连接,连接请求地址将被改成下面形式
// wss://域名/loginapp?port=20013
// wss://域名/baseapp?port=20013
// 也就是我们设置nginx时新增的那俩个块形式
this.getServerAddr = function(ip, port, app)
{
var serverAddr = KBEngine.app.protocol + ip;
if(KBEngine.app.isWss) {
serverAddr += '/'+ app + '?port=' + port;
}
else if(port != "")
{
serverAddr += ":" + port;
}
return serverAddr;
}
// 接下来修改 getServerAddr 调用的地方,添加第三个参数
// 该参数使用 KBEngine.app.currconnect将要被赋值的值
// 示例如下:
this.login_loginapp = function(noconnect)
{
if(noconnect)
{
var serverAddr = this.getServerAddr(KBEngine.app.ip, KBEngine.app.port, "loginapp");
KBEngine.INFO_MSG("KBEngineApp::login_loginapp: start connect to " + serverAddr + "!");
KBEngine.app.currconnect = "loginapp";
}
}
2.客户端在初始化KBEngine时 设置使用wss连接
启动服务器,客户端连接测试!