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
Чтобы использовать эту Lua библиотеку с NGINX, убедитесь, что nginx-module-lua установлен.
Этот документ описывает lua-resty-libr3 v1.2, выпущенную 30 сентября 2019 года.
location / {
content_by_lua_block {
-- r3 router
local r3 = require("resty.r3").new();
local encode_json = require("cjson.safe").encode
function foo(params) -- foo handler
ngx.say("foo: ", encode_json(params))
end
-- routing
r3:get("/foo/{id}/{name}", foo)
-- don't forget!!!
r3:compile()
-- dispatch
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 handler
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.
-- route
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"}})
add router
Кстати, мы можем добавить маршрутизатор, указав имя метода в нижнем регистре.
Список допустимых имен методов: get, post, put, delete, patch, head, options.
-- route
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: таблица Luamethod: необязательный, имя метода клиентского запроса.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
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-libr3.