光阴如是,岁月如梭,风水轮流转,由于我国社会主义体特色版号规定,曾几何时伟大的mmo游戏被舍弃,现在开始制作 微信小游戏。
由于微信小游戏的审查机制,需要做正式服和提审服区分(腾讯严打诱导分享 图片版权问题等)。so ~~ ~~~
提审版 -----> 提审服 。
审核通过后 -------> 正式服。
小游戏前后端通信只能用wss 协议,游戏服务器搭建ws协议支持,后用Nginx 实现wss层:
- 搭建游戏服务器支持ws:
笔者服务器使用的netty,需要配置几个Pipeline: HttpServerCodec ChunkedWriteHandler HttpObjectAggregator WebSocketServerProtocolHandler (这个是真正用于支持ws协议的) ServerHandler(游戏玩法逻辑 自己实现)
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 10240)
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) //使用内存池
.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) //使用内存池
.childOption(ChannelOption.TCP_NODELAY, true)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new ChannelInitializer<SocketChannel>(){
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpServerCodec());
//ChunkedWriteHandler分块写处理,文件过大会将内存撑爆
p.addLast(new ChunkedWriteHandler());
p.addLast(new HttpObjectAggregator(64 *1024));
p.addLast(new WebSocketServerProtocolHandler("/ws"));
p.addLast(new ServerHandler());
}
});
WebSocketServerProtocolHandler("/ws") 中 “/ws” 必写 .客户端访问方式为:
wss://www.你的域名/ws.com 或 ws://你的ip:端口号/ws
- 搭建Nginx 支持wss :
1.正式服服务器:
upstream gameserver{
server 127.0.0.1:端口号 weight=1;
}
server {
listen 443;
add_header "Access-Control-Allow-Origin" "*";
server_name www.你的域名.com;
ssl on;
ssl_certificate 1_证书.crt;
ssl_certificate_key 2_证书.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location ~/ws {
valid_referers none blocked server_names ~/wxappid/(0|devtools)/page-frame.html;
if ($invalid_referer !~ "1") {
proxy_pass http://测试服:端口号;
break;
}
}
#limit_req zone=allips burst=5 nodelay;
#limit_req zone=allips burst=1 nodelay;
proxy_pass http://gameserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
/wxappid/(0|devtools)/page-frame.html 为区分测试服的正则表达式。invalid_referer 为Nginx防盗链,若网络连接 Referer 来源匹配 server_names 正则表达式 ,其值为 0 ,反之 为 1 , 若 为 1 , 跳转到测试服务器 。
腾讯官方文档:
后面 proxy_http_version 1.1
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade"
实现了 wss 中的 “s” 层 ,此处困惑了好久 ,有人说用netty使用Ssl也可以实现s层 ,然并卵 。。。若有童鞋实现了,欢迎指正~~ 。
2.提审服服务器:
upstream gameserver{
server 127.0.0.1:端口号 weight=1;
}
server
{
listen 7775 ssl;
server_name wwwEx.你的域名.com; #填写绑定证书的域名
ssl on;
ssl_certificate /server/nginx/sbin/1_证书.com_bundle.crt;
ssl_certificate_key /server/nginx/sbin/2_证书.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #按照这个套件配置
ssl_prefer_server_ciphers on;
#微信小游戏
location ~/ws {
#limit_req zone=allips burst=5 nodelay;
#limit_req zone=allips burst=1 nodelay;
proxy_pass http://gameserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
同样 实现了 wss 中的 “s” 层 ,配置跳转到 gameserver。
总体流程图: