router: Lua http router для 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-router
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-router
Чтобы использовать эту Lua библиотеку с NGINX, убедитесь, что nginx-module-lua установлен.
Этот документ описывает lua-resty-router v0.1.0, выпущенный 26 июня 2017 года.
Эта Lua библиотека является http маршрутизатором для модуля ngx_lua nginx:
http://wiki.nginx.org/HttpLuaModule
Эта Lua библиотека использует API cosocket ngx_lua, который обеспечивает 100% неблокирующее поведение.
Обратите внимание, что требуется как минимум ngx_lua 0.5.0rc29 или OpenResty 1.0.15.7.
Синопсис
server {
location /test {
content_by_lua '
local Router = require "resty.router"
router = Router:new()
router:get("/a/:b/:c", function(params)
ngx.print(params["b"].."-"..parmams["c"])
end)
router:post("/b/c/*.html", function(params)
ngx.print("echo html")
end)
router:any("/c/d/", function(params)
ngx.print("hello, world")
end)
';
}
}
Методы
Аргумент key, предоставленный в следующих методах, будет автоматически экранирован в соответствии с правилами экранирования URI перед отправкой на сервер memcached.
new
синтаксис: r, err = router:new()
Создает объект маршрутизатора, никогда не возвращает ошибку.
route
Используя GET, POST, HEAD, PUT, PATCH, DELETE, ANY и OPTIONS
local R = require("resty.router")
local router = R:new()
router:get("/GetRoute", handler)
router:post("/PostRoute", handler)
router:head("/HeadRoute", handler)
router:put("/PutRoute", handler)
router:delete("/DeleteRoute", handler)
router:patch("/PatchRoute", handler)
router:options("/OptionsRoute", handler)
router:any("/AnyRoute", handler)
router:run()
Параметры в пути
local R = require("resty.router")
local router = R:new()
-- ловит все, когда маршрут совпадает
router:get("/*", function(params) -- /* или * подходит
ngx.say("catch all")
ngx.exit(200)
end)
-- Этот обработчик будет совпадать с /user/john, но не будет совпадать ни с /user/, ни с /user
router:get("/user/:name", function(params)
local name = params["name"]
ngx.print("Hello", name)
ngx.exit(200)
end)
-- Однако этот будет совпадать с /user/john/ и также с /user/john/send
-- Если другие маршрутизаторы не совпадают с /user/john, он будет перенаправлен на /user/john/
router.get("/user/:name/*", function(params)
local name = params("name")
ngx.print("Hello", name)
ngx.exit(200)
end)
-- Этот будет совпадать с /user/jhon/send.html, также совпадает с любым uri, начинающимся с /user/jhon/ и заканчивающимся на .html
router:get("/user/jhon/*.html", function(params)
ngx.print("Hello")
ngx.exit(200)
end)
router:run()
обработчик
Тип параметра обработчика должен быть функцией или строкой, когда тип:
- функция, обработчик будет вызван, когда uri совпадает
- строка, маршрутизатор будет требовать
a.b, когда возвращаемый тип - таблица, ищет методhandle, если возвращаемый тип - функция, возвращаемая функция будет вызвана.
Советы
- правило '*' может использоваться в конце маршрута
- выбрасывать http код 500, когда маршруты конфликтуют
run
Метод run будет находить маршрут и вызывать обработчик. Когда обработчик не найден и установлен notfound_handler, вызывается обработчик.
local R = require("resty.router")
local router = R:new()
router:run() -- или router:run(notfound_handler)
Ограничения
- Эта библиотека не может использоваться в контекстах кода, таких как
set_by_lua*,log_by_lua*иheader_filter_by_lua*, где API cosocket ngx_lua недоступен. - Экземпляр объекта
resty.memcachedне может храниться в переменной Lua на уровне модуля Lua, потому что он будет разделяться всеми параллельными запросами, обрабатываемыми одним и тем же рабочим процессом nginx (см. http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker) и приведет к плохим условиям гонки, когда параллельные запросы пытаются использовать один и тот же экземплярresty.memcached. Вы всегда должны инициализировать объектыresty.memcachedв локальных переменных функции или в таблицеngx.ctx. Эти места имеют свои собственные копии данных для каждого запроса.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-router.