libr3: 基于libr3的高性能路径调度库,用于nginx-module-lua
安装
如果您尚未设置RPM仓库订阅,请注册。然后您可以继续以下步骤。
CentOS/RHEL 7或Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-libr3
CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-libr3
要在NGINX中使用此Lua库,请确保已安装nginx-module-lua。
本文档描述了lua-resty-libr3 v1.2,于2019年9月30日发布。
location / {
content_by_lua_block {
-- r3 路由器
local r3 = require("resty.r3").new();
local encode_json = require("cjson.safe").encode
function foo(params) -- foo 处理函数
ngx.say("foo: ", encode_json(params))
end
-- 路由
r3:get("/foo/{id}/{name}", foo)
-- 别忘了!!!
r3:compile()
-- 调度
local ok = r3:dispatch("/foo/a/b", ngx.req.get_method())
if not ok then
ngx.exit(404)
end
}
}
方法
new
syntax: r3, err = r3router:new()
创建一个r3对象。如果失败,返回nil和描述错误的字符串。
syntax: r3, err = r3router:new(routes)
routes是一个数组表,如{ {...}, {...}, {...} },数组中的每个元素都是一个路由,表示为一个哈希表。
每个元素的属性可能包含以下内容:
* path: 客户端请求的URI。
* handler: Lua回调函数。
* host: 可选,客户端请求的主机,不仅支持普通域名,还支持通配符名称,foo.com和*.foo.com都是有效的。
* remote_addr: 可选,客户端远程地址,如192.168.1.100,我们可以使用CIDR格式,例如192.168.1.0/24。
* methods: 可选,这是一个数组表,我们可以将一个或多个方法名称放在一起。有效的方法名称有:“GET”、“POST”、“PUT”、“DELETE”、“PATCH”、“HEAD”、“OPTIONS”。
示例:
-- foo 处理函数
function foo(params)
ngx.say("foo: ", require("cjson").encode(params))
end
local r3route = require "resty.r3"
local r3 = r3route.new({
{
path = [[/foo/{:\w+}/{:\w+}"]],
method = {"GET"},
handler = foo
},
{
path = [[/bar/{:\w+}/{:\w+}]],
host = "*.bar.com",
handler = foo
},
{
path = [[/alice/{:\w+}/{:\w+}]],
remote_addr = "192.168.1.0/24",
handler = foo
},
{
path = [[/bob/{:\w+}/{:\w+}]],
method = {"GET"},
host = "*.bob.com",
remote_addr = "192.168.1.0/24",
handler = foo
},
})
insert_route
syntax: r3, err = r3:insert_route(path, callback, opts)
path: 客户端请求的URI。callback: Lua回调函数。
opts是可选参数,它是一个Lua表。
* method: 这是一个数组表,我们可以将一个或多个方法名称放在一起。
* host: 可选,客户端请求的主机,不仅支持普通域名,还支持通配符名称,foo.com和*.foo.com都是有效的。
* remote_addr: 可选,客户端远程地址,如192.168.1.100,我们可以使用CIDR格式,例如192.168.1.0/24。
-- 路由
local function foo(params)
ngx.say("foo")
end
local r3route = require "resty.r3"
local r3 = r3route.new()
r3:insert_route("/a", foo)
r3:insert_route("/b", foo, {method = {"GET"}})
添加路由器
顺便说一下,我们可以通过指定小写的方法名称来添加路由器。
有效的方法名称列表:get、post、put、delete、patch、head、options。
-- 路由
local function foo(params)
ngx.say("foo")
end
r3:get("/a", foo)
r3:post("/b", foo)
r3:put("/c", foo)
r3:delete("/d", foo)
compile
syntax: r3:compile()
它将我们的路由路径编译成前缀树(trie)。在添加所有路由后,必须进行编译,否则可能无法匹配。
dispatch
syntax: ok = r3:dispatch(path, method)
path: 客户端请求的URI。method: 客户端请求的方法名称。
syntax: ok = r3:dispatch(path, opts)
path: 客户端请求的URI。opts: 一个Lua表method: 可选,客户端请求的方法名称。host: 可选,客户端请求的主机,不仅支持普通域名,还支持通配符名称,foo.com和*.foo.com都是有效的。remote_addr: 可选,客户端远程地址,如192.168.1.100,我们可以使用CIDR格式,例如192.168.1.0/24。
通过method、path和host将路径调度到控制器。
local ok = r3:dispatch(ngx.var.uri, ngx.req.get_method())
dispatch2
syntax: ok = r3:dispatch2(param_tab, path, method)
syntax: ok = r3:dispatch2(param_tab, path, opts)
基本上与dispatch相同,支持传入一个table对象来存储解析参数,使得重用Lua表更容易。
Ubuntu
sudo apt-get install check libpcre3 libpcre3-dev build-essential libtool \ automake autoconf pkg-config
CentOS 7
sodu yum install gcc gcc-c++ git make automake autoconf pcre pcre-devel \ libtool pkgconfig
### 编译和安装
GitHub
您可以在nginx-module-libr3的GitHub仓库中找到此模块的其他配置提示和文档。