Мы реализовали веб-сервис для проверки домена. Что нас интересует, так это влияние на производительность выдачи веб-запроса в методе allow_domain
? Также как часто вызывается этот метод? Вызывается ли он ТОЛЬКО непосредственно перед последовательностью Let's Encrypt?
Казалось бы, если есть сертификат для домена в хранилище, нам не нужно называть его allow_domain
.
Возможно, в документации было бы полезно немного больше такого рода объяснений.
Спасибо.
Вызывается независимо от того, есть ли у вас сертификат. Лично я проверяю, есть ли у нас уже сертификат, прежде чем спрашивать наш бэкэнд, можно ли сгенерировать новый.
-- first check if we have the certificate already, else check with backend if we allow it
local certstorage = auto_ssl:get("storage")
local fullchain_pem, privkey_pem = certstorage:get_cert(domain)
if fullchain_pem then
return true
else ...
Меня также немного беспокоят накладные расходы / влияние на производительность, но я все еще на стадии планирования и еще не продвинулся так далеко.
@brianlund, спасибо, что поделились. Я реализовал локальный lua_shared_dict
для «кеширования» наших результатов из указанной веб-службы.
auto_ssl:set("allow_domain", function(domain)
local http = require "resty.http"
local httpc = http.new()
local cjson = require "cjson"
local our_allow_domain_cache = ngx.shared.our_allow_domain_cache
local found = our_allow_domain_cache:get(domain)
if found == nil then
local res, err = httpc:request_uri("[is domain allowed web service]"..domain, {
method = "GET",
})
if not res then
found = false
else
local data = cjson.decode(res.body)
found = data.found
end
-- Cache for 60 seconds, for now...
our_allow_domain_cache:set(domain, found, 60)
else
if found then
-- Known good domain, keep it in cache for a little longer
our_allow_domain_cache:set(domain, found, 300)
end
end
Мне очень нравится ваша идея проверить сервис auto_ssl:get("storage")
. Я мог бы пойти с чем-то похожим. Можно ли предположить, что это происходит при каждом запросе? Или lua_shared_dict auto_ssl
используется как слой кеширования для хранения? Похоже, это может быть: https://github.com/GUI/lua-resty-auto-ssl/blob/master/lib/resty/auto-ssl/ssl_certificate.lua#L20
Интересно, не лучше ли в вашем примере проверить:
ngx.shared.auto_ssl:get("domain:fullchain_der:" .. domain)
vs прямой вызов storage
.
Я считаю, что ngx.shared.auto_ssl:get("domain:fullchain_der:" .. domain)
проверяет только кеш разделяемой памяти. Я планирую запускать несколько узлов, поэтому мне нужно что-то общее между ними (хранилище Redis). Тем не менее, мне нравится ваше решение для кеширования, оно сэкономит много вызовов службе хранилища, если я увижу какие-либо проблемы с его частым вызовом, я буду иметь это в виду.
Я хотел поблагодарить вас @jasonbouffard за ваш демонстрационный код - это был чрезвычайно полезный строительный блок для меня! Ценить это!
Можно ли предположить, что это происходит при каждом запросе?
Это действительно хороший вопрос.
Я предполагаю, что этот метод вызывается, когда для домена нет сертификата, но я не уверен в этом.
Удалось ли вам это подтвердить
@ Alir3z4
Мне это тоже было любопытно.
Документы об этом не так прозрачны, поэтому мне пришлось проверить исходный код.
Итак, при каждом запросе auto-ssl делает следующее:
ngx.shared.auto_ssl
, которые кешируются на 1 часallow_domain
Было бы идеально объяснить это на README.md.
Спасибо!
Источник: