ACME-сертификаты на VPS: как не сломать nginx и автопродление
ACME-клиенты позволяют автоматически выпускать и продлевать сертификаты. Но если nginx занимает 80 порт, standalone-проверка может ломаться. Поэтому важно выбрать правильную схему.
HTTP-01 challenge
При HTTP-01 центр сертификации обращается к серверу по 80 порту и проверяет специальный ответ. Поэтому порт 80 должен быть доступен снаружи.
Standalone-режим
В standalone-режиме ACME-клиент сам поднимает временный HTTP-сервер. Если nginx уже слушает 80 порт, выпуск завершится ошибкой.
Решение — временно остановить nginx через pre-hook и запустить обратно через post-hook.
Webroot-режим
В webroot-режиме nginx продолжает работать, а ACME-клиент кладёт challenge-файл в каталог сайта. Это аккуратнее для обычного веб-сервера, но требует правильного location.
location ^~ /.well-known/acme-challenge/ {
root /var/www/site;
default_type text/plain;
allow all;
}
Pre-hook и post-hook
--pre-hook "systemctl stop nginx || true" \
--post-hook "systemctl start nginx || true"
Такой подход подходит, если вы осознанно используете standalone и готовы освобождать порт 80 на время проверки.
Reload hook
После обновления сертификата сервис должен перечитать файлы. Если сертификат использует x-ui, nginx или другой сервис, его нужно перезапустить или reload-нуть.
Проверка
~/.acme.sh/acme.sh --list
grep -E "Le_PreHook|Le_PostHook|Le_ReloadCmd" ~/.acme.sh/*/*.conf