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

vhost: Библиотека сопоставления имен хостов для 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-vhost

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-vhost

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-vhost v0.1, выпущенный 14 октября 2016 года.


Библиотека для сопоставления имен хостов со значениями. Поддерживает синтаксис с подстановочными знаками и .hostname.tld так же, как и директива Nginx server_name.

Ключи, начинающиеся с . или *. будут соответствовать корневому домену и всем поддоменам, выигрывает самое длинное совпадение. Совпадения без подстановочных знаков всегда имеют приоритет.

Совпадения по регулярным выражениям и префиксные подстановочные знаки не поддерживаются.

Обзор

init_by_lua_block {
    local vhost = require("resty.vhost")
    my_vhost = vhost:new()
    local ok, err = my_vhost:insert("example.com",      { key = "example.com.key",          cert = "example.com.crt" })
    local ok, err = my_vhost:insert("www.example.com",  { key = "example.com.key",          cert = "example.com.crt" })
    local ok, err = my_vhost:insert(".sub.example.com", { key = "star.sub.example.com.key", cert = "star.sub.example.com.crt" })
    local ok, err = my_vhost:insert("www.example2.com", { key = "www.example2.com.key",     cert = "www.example2.com.crt" })
}

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name vhost;

    ssl_certificate         /path/to/default/cert.crt;
    ssl_certificate_key     /path/to/default/key.crt;

    ssl_certificate_by_lua_block {
        local val, err = my_vhost:lookup(require("ngx.ssl").server_name())
        if not val then
            ngx.log(ngx.ERR, err)
        else
            ngx.log(ngx.DEBUG, "Match, setting certs: ", val.cert, " ", val.key)
            -- set_certs_somehow(val)
        end
    }

    location / {
        content_by_lua_block {
            local val, err = my_vhost:lookup(ngx.var.host)
            if val then
                -- do something based on val
                ngx.say("Matched: ", val.cert)
            else
                if err then
                    ngx.log(ngx.ERR, err)
                end
                ngx.exit(404)
            end
        }
    }
}

Методы

new

синтаксис: my_vhost, err = vhost:new(size?)

Создает новый экземпляр resty-vhost с необязательным начальным размером.

insert

синтаксис: ok, err = my_vhost:insert(key, value)

Добавляет новый ключ имени хоста с соответствующим значением.

Ключи должны быть строками.

Возвращает false и сообщение об ошибке в случае неудачи.

lookup

синтаксис: val, err = my_vhost:lookup(hostname)

Извлекает значение для наиболее подходящей записи имени хоста.

Возвращает nil и сообщение об ошибке в случае неудачи.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-vhost.