Перейти к содержанию

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.