Бесплатный SSL-сертификат для сайта: размещение сайта на Nginx с Let's Encrypt (Certbot) в Linux
Любой публичный сайт должен работать по HTTPS, а бесплатный SSL-сертификат Let's Encrypt делает это простым. В инструкции показано, как разместить сайт на облачном или выделенном сервере JUSTG с Nginx, выпустить сертификат Let's Encrypt через certbot, проверить автоматическое продление и включить принудительный HTTPS. Команды приведены для Debian/Ubuntu и CentOS/Rocky Linux/AlmaLinux. В примере домен example.com и IP сервера 203.0.113.10 — замените их на свои.
Шаг 1: Направьте домен на сервер JUSTG (записи A и AAAA)
У регистратора или DNS-провайдера создайте A-записи для основного домена и www, указывающие на IPv4 сервера. Облачные серверы JUSTG также получают бесплатный IPv6; добавляйте AAAA-запись, только если IPv6 настроен на сервере и Nginx его слушает. Дождитесь, пока записи начнут резолвиться, прежде чем запрашивать сертификат: Let's Encrypt проверяет домен через интернет.
# A example.com -> 203.0.113.10
# A www.example.com -> 203.0.113.10
# AAAA example.com -> 2001:db8::10 (optional, only if IPv6 is configured)
# check from the server (Debian/Ubuntu: apt install -y dnsutils, Rocky: dnf install -y bind-utils)
dig +short example.com A
dig +short www.example.com A
dig +short example.com AAAAШаг 2: Установите Nginx и certbot в Debian или Ubuntu
Плагин certbot для Nginx умеет сам править конфигурацию Nginx. Установите все из стандартных репозиториев:
apt update
apt install -y nginx certbot python3-certbot-nginx
systemctl enable --now nginx
ufw allow 'Nginx Full' # if UFW is enabledШаг 3: Установите Nginx и certbot в Rocky Linux, AlmaLinux или CentOS
В системах на базе RHEL certbot берется из репозитория EPEL. Также откройте HTTP и HTTPS в firewalld:
dnf install -y epel-release
dnf install -y nginx certbot python3-certbot-nginx
systemctl enable --now nginx
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reloadШаг 4: Создайте сайт и блок server в Nginx
Создайте корневой каталог с тестовой страницей. В системах с SELinux команда restorecon гарантирует, что Nginx сможет читать файлы.
mkdir -p /var/www/example.com
echo '<h1>example.com is online</h1>' > /var/www/example.com/index.html
restorecon -Rv /var/www/example.com # Rocky/Alma/CentOS with SELinux onlyЗатем добавьте блок server для домена:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Сохраните его в нужное для вашего дистрибутива место, проверьте синтаксис и перезагрузите Nginx:
# Debian / Ubuntu: save as /etc/nginx/sites-available/example.com, then
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# CentOS / Rocky / AlmaLinux: save as /etc/nginx/conf.d/example.com.conf
nginx -t && systemctl reload nginx
curl -I http://example.comЕсли curl -I возвращает 200 OK, сайт доступен по HTTP и можно получать сертификат.
Шаг 5: Получите бесплатный SSL Let's Encrypt командой certbot --nginx
Запустите certbot, перечислив все доменные имена для сертификата. При первом запуске он попросит e-mail для уведомлений об истечении срока и согласие с условиями Let's Encrypt. Ключ --redirect добавляет автоматический редирект с HTTP на HTTPS.
certbot --nginx -d example.com -d www.example.com --redirectcertbot подтверждает владение доменом через временный файл, который отдает Nginx, устанавливает сертификат в блок server и перезагружает Nginx.
Шаг 6: Проверьте автоматическое продление
Сертификаты Let's Encrypt действуют недолго, поэтому продление должно быть автоматическим. Пробный запуск проверяет весь процесс, не трогая реальный сертификат:
certbot renew --dry-run
# Debian / Ubuntu: the timer is enabled by the package
systemctl list-timers | grep certbot
# Rocky / AlmaLinux (EPEL): enable the renewal timer once
systemctl enable --now certbot-renew.timerЕсли пробный запуск прошел успешно и таймер активен, больше ничего делать не нужно.
Шаг 7: Включите принудительный HTTPS и проверьте результат
Если вы не использовали --redirect, включите HTTPS вручную: замените блок для порта 80 редиректом, оставив блок HTTPS, созданный certbot:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}Перезагрузите Nginx и проверьте:
curl -I http://example.com # expect 301 to https://
curl -I https://example.com # expect 200
certbot certificatesАльтернатива: SSL в один клик в aaPanel
Если на сервере установлена aaPanel, ручные шаги можно пропустить. Добавьте сайт в разделе Website, откройте его настройки, перейдите в раздел SSL, выберите Let's Encrypt, отметьте доменные имена и примените. Затем включите переключатель Force HTTPS. aaPanel продлевает сертификат автоматически. DNS-записи из шага 1 по-прежнему нужны.
Частые вопросы
certbot завершается ошибкой соединения или тайм-аутом. Что проверить?
Убедитесь, что записи A и AAAA указывают на этот сервер, порты 80 и 443 открыты в UFW или firewalld и Nginx запущен. Неверная AAAA-запись — частая причина, так как проверка может идти по IPv6.
Можно ли одним сертификатом покрыть несколько доменов?
Да. Добавьте в команду certbot дополнительные ключи -d; каждое имя должно указывать на сервер.
Нужно ли перезапускать Nginx после продления?
Нет. Плагин certbot для Nginx сам перезагружает Nginx после успешного продления.
Если проблему решить не удалось, создайте тикет в техническую поддержку JUSTG.