在上一章 基于OpenResty部署Nginx以及LUA脚本开发 中我们简单的使用OpenResty开发了一个输出 hello world的LUA脚本。这次我们进阶,使用OpenResty 开发一个Nginx 分发脚本。
我们知道Nginx 原生自带 负载均衡策略,但是我们开发业务的时候,很多需要根据业务去做负载分发,比如某些高并发高频的数据,我们可以暂时缓存在Nginx本地,当服务请求过来时,直接在Nginx服务器上拿到缓存数据返回,这样大大的减轻了后端压力。这里我只介绍分发脚本代码,缓存代码兴趣的同学可以自己写写试试。
场景模拟
我们有3台服务器,当客户端发送http请求时,我们可以根据请求附带的某些参数来进行分发。这里我们就简单的使用 http://ip/lua?id= 这个URL来进行分发。
具体分发流程如下图所示
流程图.jpg前期准备
首先我们需要三台虚拟机或者云服务器,然后分别安装OpenResty,这里可以参照我前一篇文章,因为下面的所有修改都是基于前一篇文章来的。
- SERVER-1:分发服务器
- SERVER-2:待分发服务器
- SERVER-3:待分发服务器
类库添加
下载 下载http.lua和http_headers.lua库
并且上传到 SERVER-1 服务器的 /usr/local/openresty/lualib/resty
目录下,如图所示
SERVER-1 : 分发层
编写lua脚本
这里我使用了之前的hello.lua脚本,这样少去了很多配置
我们打开hello.lua脚本进行编辑
vi /usr/local/openresty/nginx/lua/hello.lua
将之前的内容去除,填入以下代码
local uri_args = ngx.req.get_uri_args()
local args_id = uri_args["id"]
local host = {"122.51.192.50", "120.92.35.122"}
local hash = ngx.crc32_long(args_id)
hash = (hash % 2) + 1
backend = "http://"..host[hash].."/lua"
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri(backend, {
method = "GET"
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.say(resp.body)
httpc:close()
如图所示
分发层.jpg保存退出
执行以下命令:
检查命令
/usr/local/openresty/nginx/sbin/nginx -t
更新命令
/usr/local/openresty/nginx/sbin/nginx -s reload
SERVER-2 待分发服务器
待分发的服务器很简单,我们只要按照 基于OpenResty部署Nginx以及LUA脚本开发 安装好即可。安装好后,修改 hello.lua文件
vi /usr/local/openresty/nginx/lua/hello.lua
改为
ngx.say("hello world, I am Iron Man");
保存退出
执行以下命令:
检查命令
/usr/local/openresty/nginx/sbin/nginx -t
更新命令
/usr/local/openresty/nginx/sbin/nginx -s reload
SERVER-3 待分发服务器
如上操作即可,只是将 ngx.say("hello world, I am Iron Man");
改为 ngx.say("hello world, I am Hulk");
。
运行测试
我们按照之前的逻辑,将请求 发到 服务层,根据参数id
的值不同,看是否可以分发到不同的Nginx服务器上。
分发成功!
小结
其实按照这个思路,我想基于OpenResty 第三方组件,可以做很多事情,只是时间去研究和调试的问题了。
网友评论