openresty使用笔记(一)

摘要:
使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案。技术实现思路要编写lua插件通常需求编译nginx使其支持,如果嫌麻烦可以直接上手openresty就可以了。我刚开始编译nginx插件模块也费了不少时间,现在使用openresty方便多了。server{listen9009;location/{set$websocket_addr"";proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection"upgrade";proxy_set_headerX-Real-Ip$remote_addr;proxy_set_headerX-Scheme$scheme;rewrite_by_lua_file/usr/local/lua/dispatcher.lua;proxy_passhttp://$websocket_addr;}}注意这里刚开始,我使用的是set_by_lua_file来返回一个websocket_add。下面就可以重新启动你的openresty版本的nginx了。
背景介绍

游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构。使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案。先看看下面这张简单的架构图吧~

openresty使用笔记(一)第1张

从图上看,结构是非常简单的。主要通过编写lua分配策略使游戏房间内的人数尽量坐满。

技术实现思路

要编写lua插件通常需求编译nginx使其支持,如果嫌麻烦可以直接上手openresty就可以了。我刚开始编译nginx插件模块也费了不少时间,现在使用openresty方便多了。
我们的游戏房间是9个人,产品需要优先坐满一个房间才分配下一个房间;玩家通过websocket连接到咱们的服务器上,为了使nginx记住我们的节点负载情况,我使用redis记录每一个节点的连接数量,并设计一套权重策略依据节点连接数量求9的余数进行排序。当然具体看代码更加容易理解~~

准备工作

假设已经安装好了openresty,可以直接在/usr/local/openresty/nginx/conf下面找到nginx.conf文件,增加下面一行(注意如果已经安装了nginx的其他版本,需要将openresty安装的nginx进行端口重新配置)

...
 30     #keepalive_timeout  0;
 31     keepalive_timeout  65;
 32     include /usr/local/openresty/nginx/conf.d/*.conf;
 33     #gzip  on;
....

为了方便加载个人的配置,我在nginx下面自己建立了一个conf.d文件目录,存放自己的配置。下面查看nginx具体配置。

server {
        listen 9009;    
        location / { 
            set $websocket_addr ""; 
            proxy_set_header Upgrade $http_upgrade;    
            proxy_set_header Connection "upgrade";    
            proxy_set_header X-Real-Ip $remote_addr;    
            proxy_set_header X-Scheme $scheme;    
            rewrite_by_lua_file /usr/local/lua/dispatcher.lua;    
            proxy_pass http://$websocket_addr;    
        }   
}

注意这里刚开始,我使用的是set_by_lua_file来返回一个websocket_add。那样容易理解但是不支持redis,与数据库的访问。所以这里使用了rewrite_by_lua_file方式。在开始出声明了websocket_add全局变量,主要是为了在lua插件里面进行修改。下面看lua插件简单版本为了方便管理,我建立了lua代码目录在/usr/local/lua。文件名取名为dispatcher.lua

local var = ngx.var
hosts = { 
  "127.0.0.1:8109",
  "127.0.0.1:8108",
}
host = hosts[math.random(#hosts)]
ngx.var.websocket_addr = host

这个时候再打开一个websocket服务器,例如我跑了两个tornado的websocket服务器分别运行了8109/8108端口,(websocket服务器简单版在https://github.com/land-pack/tornado-websocket-example/blob/master/app/simple.py)
这时候你最好启动两个,分别监听这两个端口。下面就可以重新启动你的openresty版本的nginx了。
通过chrome的websocket客户端你可以访问到下面这个地址。

openresty使用笔记(一)第2张

可以看到,我们的请求得到了回复。那么这次我只是通过lua的随机数进行的负载分配的,这就是我们的第一步,下一篇我将会介绍如何通过redis来管理分配我们的客户端连接~~

总结

好久没写blog了,最近又学了那么多新玩意,想记录一下~~

免责声明:文章转载自《openresty使用笔记(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]用户故事【任务分解】和软件开发不得不说的故事【Win 10应用开发】多窗口视图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

谷粒商城学习——P124 es 自定义扩展词库

P122中安装的ik分词器, 本身默认的词库并不支持一些新的词汇,这就需要修改ik分词器的配置文件,指定远程词库进行扩展词库。ik分词器向远程发送请求要到最新的单词,这样最新的单词就会做为新的词源远行分解。可以给nginx发送请求,nginx反回最新词库。 虚拟机装nginx,内存不够,先将虚拟机关机,打开设置,将内存调到3075,然后重启      然...

websocket --工作原理

1,简历socket连接,启动服务端2,客户端在html里面写数据建立连接<script type="text/javascript"> var socket = new WebSocket("ws://127.0.0.1:8002/xxoo"); ...</script> 3,双方建立握手 服务端拿到,客户端传过来的数据 拿到头部...

基于动态代理的WebAPI/RPC/webSocket框架,一套接口定义,多个通讯方式

API/RPC/webSocket三个看起来好像没啥相同的地方,在开发时,服务端,客户端实现代码也大不一样 最近整理了一下,通过动态代理的形式,整合了这些开发,都通过统一的接口约束,服务端实现和客户端调用 基于这样的形式,WebAPI/RPC/webSocket只需要定义一套接口,就能达到通用的效果  示例接口约束 public class Tes...

Mac-Pycharm中的Terminal(zsh)的python版本和终端python版本不同

python版本不同--mac 突然发现,pycharm 控制台运行python好好地。 但是pycharm中的Terminal无法运行。发现是因为版本不同。 从上面看出来。 本地的python版本是3.7 pycharm解释器调用的也是3.7 但是pycharm的Terminal 中调用的是3.8 我本地貌似是没有3.8 这个版本。 解决办法 mac上...

关于Python IDLE reload(sys)后无法正常执行命令的原因

转载自:http://blog.csdn.net/kxcfzyk/article/details/41414247?utm_source=tuicool&utm_medium=referral 通常大多数人执行reload(sys)这条语句其实仅仅是为了能够修改Python的默认字符集,也就是能够调用sys.setdefaultencoding()...

Nginx上部署HTTPS + HTTP2

  Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev(或者OpenSSL),且ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/,然后在编译配置Nginx时要指定--with-http_ssl_module和--with-http_v2_module。另外,若要...