跳转至

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"}})

添加路由器

顺便说一下,我们可以通过指定小写的方法名称来添加路由器。

有效的方法名称列表:getpostputdeletepatchheadoptions

-- 路由
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

通过methodpathhost将路径调度到控制器。

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

### 编译和安装
sudo make install ```

GitHub

您可以在nginx-module-libr3的GitHub仓库中找到此模块的其他配置提示和文档。