BLACKBOXЦентр помощи

Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt

Установка nginx или Apache, настройка сайта для вашего домена и получение бесплатного сертификата Let's Encrypt с помощью certbot.

общееОбновлено 2026-10-09~10 мин чтения
На этой странице

Это руководство показывает, как разместить сайт на сервере BLACKBOX: установить веб-сервер nginx или Apache, настроить сайт для вашего домена и получить бесплатный HTTPS-сертификат Let's Encrypt с помощью certbot. Вы работаете в терминале сервера, подключившись по SSH под пользователем root (Подключение к серверу по SSH (Windows, macOS, Linux)). Раздела для веб-серверов или сертификатов в панели app.blackbox.md нет: из неё вам нужен только IP-адрес сервера — он указан в карточке сервера на странице «Мои серверы» (app.blackbox.md/my-servers).

Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX с Ubuntu 24.04, 22.04 или 20.04, Debian 12 или 11, AlmaLinux 9 либо CentOS Stream 9.

В командах замените ДОМЕН на ваш домен без www (например, example.com). Выберите один веб-сервер — nginx или Apache: оба используют порты 80 и 443 и не могут работать одновременно.

Если у вас тариф «VPS hosting» с панелью управления, не устанавливайте поверх неё другой веб-сервер: сайты и сертификаты настраиваются в самой панели управления. Если вы не знаете, какая у вас панель или как в неё войти, напишите в поддержку. См. Тарифы «VPS hosting» с панелью управления.

Перед началом

Условие Подробности
Домен указывает на сервер A-записи для ДОМЕН и www.ДОМЕН указывают на IP_СЕРВЕРА, и не осталось AAAA-записей от прежнего хостинга; см. Как направить домен на сервер
Порты 80 и 443 открыты на новом сервере сетевая фильтрация BLACKBOX пропускает SSH (22), HTTP (80), HTTPS (443) и ping; файрвол в системе (ufw, firewalld) не включён
Порты 80 и 443 свободны их не занимает другая программа (другой веб-сервер)

Проверьте на сервере, какие программы слушают порты 80 и 443. На новом сервере команда ничего не выведет:

ss -tlnp | grep -E ':80|:443'

Если вы сами включили файрвол в системе, разрешите HTTP и HTTPS. На Ubuntu и Debian (ufw):

ufw allow 80,443/tcp

На AlmaLinux и CentOS Stream (firewalld):

firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reload

Не включайте файрвол только ради этого руководства. Если хотите его включить, сначала разрешите SSH и держите открытой вторую SSH-сессию, чтобы не потерять доступ: Файрвол: сетевая фильтрация и ufw/firewalld на сервере.

Вариант 1: nginx

Ubuntu и Debian

  1. Установите nginx. Служба запустится автоматически после установки.

    apt update
    apt install -y nginx
  2. Создайте каталог сайта и тестовую страницу:

    mkdir -p /var/www/ДОМЕН
    echo "ДОМЕН OK" > /var/www/ДОМЕН/index.html
  3. Создайте файл конфигурации сайта:

    nano /etc/nginx/sites-available/ДОМЕН
  4. Вставьте содержимое ниже, сохраните (Ctrl+O, затем Enter) и выйдите (Ctrl+X):

    server {
        listen 80;
        server_name ДОМЕН www.ДОМЕН;
        root /var/www/ДОМЕН;
        index index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
  5. Включите сайт:

    ln -s /etc/nginx/sites-available/ДОМЕН /etc/nginx/sites-enabled/
  6. Проверьте конфигурацию и перезагрузите её. Команда nginx -t должна вывести «syntax is ok» и «test is successful»; если появилась ошибка, исправьте файл до перезагрузки.

    nginx -t
    systemctl reload nginx

AlmaLinux и CentOS Stream

  1. Установите и запустите nginx:

    dnf install -y nginx
    systemctl enable --now nginx
  2. Создайте каталог сайта и тестовую страницу, затем назначьте файлам метку SELinux для веб-содержимого: на файлы без неё nginx отвечает «403 Forbidden». Запускайте restorecon снова и после того, как переместите (mv) в каталог файлы из другого места.

    mkdir -p /var/www/ДОМЕН
    echo "ДОМЕН OK" > /var/www/ДОМЕН/index.html
    restorecon -Rv /var/www
  3. Создайте файл конфигурации (если nano нет, первая команда его установит):

    dnf install -y nano
    nano /etc/nginx/conf.d/ДОМЕН.conf
  4. Вставьте тот же блок server { … }, что и для Ubuntu и Debian, сохраните и выйдите.

  5. Проверьте конфигурацию и перезагрузите её:

    nginx -t
    systemctl reload nginx

Вариант 2: Apache

Ubuntu и Debian

  1. Установите Apache. Служба запустится автоматически после установки.

    apt update
    apt install -y apache2
  2. Создайте каталог сайта и тестовую страницу командами из шага 2 варианта nginx.

  3. Создайте файл конфигурации сайта:

    nano /etc/apache2/sites-available/ДОМЕН.conf
  4. Вставьте содержимое ниже, сохраните и выйдите:

    <VirtualHost *:80>
        ServerName ДОМЕН
        ServerAlias www.ДОМЕН
        DocumentRoot /var/www/ДОМЕН
        ErrorLog ${APACHE_LOG_DIR}/ДОМЕН-error.log
        CustomLog ${APACHE_LOG_DIR}/ДОМЕН-access.log combined
    </VirtualHost>
  5. Включите сайт, проверьте конфигурацию и перезагрузите её. Команда apachectl configtest должна вывести «Syntax OK».

    a2ensite ДОМЕН.conf
    apachectl configtest
    systemctl reload apache2

AlmaLinux и CentOS Stream

  1. Установите Apache (httpd) и модуль HTTPS (mod_ssl, он нужен certbot), затем запустите службу:

    dnf install -y httpd mod_ssl
    systemctl enable --now httpd
  2. Создайте каталог сайта и тестовую страницу командами из шага 2 варианта nginx, включая restorecon.

  3. Создайте файл конфигурации сайта (если nano нет, установите его, как в шаге 3 варианта nginx):

    nano /etc/httpd/conf.d/ДОМЕН.conf
  4. Вставьте блок <VirtualHost *:80> из раздела для Ubuntu и Debian, изменив пути к журналам на /var/log/httpd/ДОМЕН-error.log и /var/log/httpd/ДОМЕН-access.log. Сохраните и выйдите.

  5. Проверьте конфигурацию и перезагрузите её:

    apachectl configtest
    systemctl reload httpd

Проверка сайта по HTTP

На своём компьютере откройте в браузере http://ДОМЕН: должен появиться текст «ДОМЕН OK». Или выполните команду ниже (в PowerShell на Windows пишите curl.exe вместо curl); ответ должен начинаться с HTTP/1.1 200 OK. Если сайт не отвечает, сначала устраните проблему: certbot нужен сайт, доступный по HTTP.

curl -I http://ДОМЕН

Сертификат Let's Encrypt с certbot

Установка certbot

Ubuntu и Debian. Для Apache установите python3-certbot-apache вместо python3-certbot-nginx.

apt install -y certbot python3-certbot-nginx

AlmaLinux и CentOS Stream. Certbot устанавливается из репозитория EPEL. Последняя команда включает таймер продления — здесь он сам не включается. Для Apache установите python3-certbot-apache.

dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx
systemctl enable --now certbot-renew.timer

На Ubuntu и Debian можно также использовать snap-версию, которую рекомендуют разработчики certbot: обычно она новее и уже содержит плагины для nginx и Apache. Используйте что-то одно — apt или snap. Если certbot уже установлен через apt, удалите его:

apt remove -y certbot

На Debian сначала установите snapd:

apt install -y snapd
snap install core

Затем установите certbot из snap:

snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Получение сертификата

  1. Запустите certbot с плагином вашего веб-сервера. Для nginx:

    certbot --nginx -d ДОМЕН -d www.ДОМЕН

    Для Apache:

    certbot --apache -d ДОМЕН -d www.ДОМЕН
  2. При первом запуске certbot попросит адрес email и согласие с условиями Let's Encrypt: введите адрес и ответьте Y. На вопрос о рассылке EFF можно ответить N.

  3. Если certbot спросит, перенаправлять ли HTTP на HTTPS (так делают старые версии), выберите «2: Redirect». Новые версии добавляют перенаправление без вопроса.

  4. В конце появится сообщение, которое начинается с «Congratulations!». Сертификат и ключ лежат в /etc/letsencrypt/live/ДОМЕН/, а certbot добавил в конфигурацию сайта блок HTTPS (порт 443) и перенаправление с HTTP.

  5. Откройте https://ДОМЕН в браузере и проверьте значок замка. Команда ниже показывает сертификаты, их домены и дату окончания срока («Expiry Date»):

    certbot certificates

Автоматическое продление

Сертификат действует 90 дней. Таймер certbot проверяет сертификаты дважды в день и сам продлевает их до окончания срока. С --nginx и --apache certbot после продления ещё и перезагружает конфигурацию веб-сервера.

Как установлен certbot Таймер продления Включён автоматически
apt (Ubuntu, Debian) certbot.timer да
snap snap.certbot.renew.timer да
EPEL (AlmaLinux, CentOS Stream) certbot-renew.timer нет: включите его командой systemctl enable --now certbot-renew.timer

Проверьте таймер и смоделируйте продление. --dry-run не выпускает новый сертификат и завершается сообщением «Congratulations, all simulated renewals succeeded» (в старых версиях — «Congratulations, all renewals succeeded»).

systemctl list-timers | grep -i certbot
certbot renew --dry-run

Примечание Let's Encrypt больше не присылает письма перед окончанием срока сертификатов и объявил, что будет постепенно сокращать срок их действия. Не планируйте продление вручную по календарю: доверьте его таймеру certbot и время от времени проверяйте дату окончания срока командой certbot certificates.

Wildcard-сертификат (*.ДОМЕН) с проверкой через DNS

Wildcard-сертификат покрывает все поддомены одного уровня (www.ДОМЕН, api.ДОМЕН и т. д.) и выпускается только с проверкой через DNS: certbot временно создаёт TXT-запись _acme-challenge.ДОМЕН. Чтобы продление оставалось автоматическим, certbot нужен плагин для вашего DNS-провайдера. Пример ниже — для Cloudflare; для других провайдеров см. список DNS-плагинов в документации certbot. Без плагина (--manual) сертификат автоматически не продлевается. Если вам нужен wildcard, выполните шаги ниже вместо шагов из раздела «Получение сертификата».

  1. В аккаунте Cloudflare создайте токен только для certbot: «My Profile» → «API Tokens» → «Create Token» → шаблон «Edit zone DNS». В «Zone Resources» выберите только зону ДОМЕН, создайте токен и скопируйте его. Не используйте токен, подключённый на странице «DNS» панели: отдельный токен можно отозвать, не затрагивая панель.

  2. Установите плагин Cloudflare. Ubuntu и Debian:

    apt install -y python3-certbot-dns-cloudflare

    AlmaLinux и CentOS Stream:

    dnf install -y python3-certbot-dns-cloudflare

    Если вы пользуетесь certbot из snap:

    snap set certbot trust-plugin-with-root=ok
    snap install certbot-dns-cloudflare

    На Ubuntu 20.04 плагин из apt слишком старый и не работает с API-токенами: используйте certbot и плагин из snap.

  3. Сохраните токен в файл:

    mkdir -p /root/.secrets
    nano /root/.secrets/cloudflare.ini

    Содержимое файла — с вашим токеном вместо ТОКЕН_CLOUDFLARE:

    dns_cloudflare_api_token = ТОКЕН_CLOUDFLARE
  4. Сделайте файл доступным только для root:

    chmod 600 /root/.secrets/cloudflare.ini
  5. Получите сертификат. --deploy-hook перезагружает конфигурацию веб-сервера после каждого продления; для Apache укажите systemctl reload apache2 (Ubuntu, Debian) или systemctl reload httpd (AlmaLinux, CentOS Stream).

    certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d ДОМЕН -d "*.ДОМЕН" --deploy-hook "systemctl reload nginx"
  6. certonly не меняет конфигурацию веб-сервера: блок для HTTPS нужно добавить в файл сайта самостоятельно. Для nginx добавьте блок ниже, затем выполните nginx -t и перезагрузите конфигурацию nginx. Для поддомена скопируйте блок и измените server_name и root; строки сертификата остаются теми же.

    server {
        listen 443 ssl;
        server_name ДОМЕН www.ДОМЕН;
        root /var/www/ДОМЕН;
        ssl_certificate     /etc/letsencrypt/live/ДОМЕН/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ДОМЕН/privkey.pem;
    }

    Чтобы перенаправлять HTTP на HTTPS, в блоке с listen 80 замените строки root, index и блок location на return 301 https://$host$request_uri;.

  7. Для Apache добавьте в файл сайта блок ниже. Чтобы перенаправлять HTTP на HTTPS, добавьте в блок <VirtualHost *:80> строку Redirect permanent / https://ДОМЕН/.

    <VirtualHost *:443>
        ServerName ДОМЕН
        ServerAlias www.ДОМЕН
        DocumentRoot /var/www/ДОМЕН
        SSLEngine on
        SSLCertificateFile    /etc/letsencrypt/live/ДОМЕН/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/ДОМЕН/privkey.pem
    </VirtualHost>

    На Ubuntu и Debian включите модуль SSL, проверьте конфигурацию и перезапустите Apache:

    a2enmod ssl
    apachectl configtest
    systemctl restart apache2

    На AlmaLinux и CentOS Stream mod_ssl уже установлен (шаг 1 варианта Apache):

    apachectl configtest
    systemctl reload httpd

Частые проблемы

Сообщение или симптом Причина Что делать
«DNS problem: NXDOMAIN looking up A for ДОМЕН» A-записи нет или она ещё не распространилась создайте запись, подождите и проверьте командой dig +short ДОМЕН A
«Timeout during connect (likely firewall problem)» порт 80 закрыт или домен указывает на другой адрес разрешите 80 и 443 в ufw/firewalld; проверьте записи A и AAAA; если не помогло, напишите в поддержку
«Connection refused» веб-сервер не запущен systemctl status nginx (или apache2, httpd) и ss -tlnp
«Invalid response from http://ДОМЕН/.well-known/acme-challenge/…» с кодом 404 запрос попадает на другой сервер: старая запись A или AAAA либо прокси Cloudflare исправьте DNS-записи; временно выключите прокси
«Could not automatically find a matching server block for ДОМЕН» нет server_name с этим доменом добавьте server_name, выполните nginx -t, перезагрузите конфигурацию и запустите certbot снова
«bind() to 0.0.0.0:80 failed (98: Address already in use)» порт 80 занят другим веб-сервером остановите или удалите его; оставьте один веб-сервер
«too many failed authorizations» или «too many certificates» лимиты Let's Encrypt подождите (см. ниже); проверяйте с --dry-run
«403 Forbidden» на AlmaLinux или CentOS Stream метка SELinux у файлов restorecon -Rv /var/www
«502 Bad Gateway» на AlmaLinux или CentOS Stream, в /var/log/nginx/error.log — «(13: Permission denied)» SELinux не даёт nginx подключиться к приложению за ним setsebool -P httpd_can_network_connect 1; см. Приложения Node.js, Python и другие сервисы: nginx как обратный прокси
ERR_TOO_MANY_REDIRECTS через Cloudflare в Cloudflare выбран режим SSL «Flexible» выберите режим «Full (strict)»

Полный журнал certbot — в /var/log/letsencrypt/letsencrypt.log.

Устранив причину, проверьте выпуск на тестовом сервере Let's Encrypt, не получая настоящий сертификат. --dry-run работает только с certonly и renew; для Apache укажите --apache.

certbot certonly --nginx --dry-run -d ДОМЕН -d www.ДОМЕН

Внимание Let's Encrypt ограничивает число попыток: после 5 неудачных проверок одного имени за час новые попытки временно отклоняются, а для одного и того же набора имён можно выпустить не больше 5 сертификатов за 7 дней. Не запускайте certbot раз за разом: проверяйте с --dry-run — такие попытки в эти лимиты не засчитываются. Подробнее: лимиты Let's Encrypt.

Домен проходит через прокси Cloudflare

  1. Для первого выпуска оставьте записи ДОМЕН и www в режиме «DNS only» (на странице «DNS» панели флажок «Прокси» снят) или используйте проверку через DNS, описанную выше.
  2. Когда сайт заработает по HTTPS напрямую на сервере, включите прокси.
  3. В аккаунте Cloudflare, в разделе «SSL/TLS», выберите режим шифрования «Full (strict)». Режим «Flexible» приводит к бесконечным перенаправлениям, потому что сервер перенаправляет HTTP на HTTPS.

Подробнее о прокси: Как направить домен на сервер.

Что дальше

Частые вопросы

Можно ли разместить несколько сайтов на одном сервере? Да. Для каждого домена создайте отдельный каталог и отдельный файл конфигурации (блок server в nginx, VirtualHost в Apache), затем запустите certbot с именами этого домена.

Как добавить поддомен в существующий сертификат? Создайте A-запись для поддомена, добавьте его в server_name (или ServerAlias), перезагрузите конфигурацию веб-сервера и запустите certbot со всеми именами — прежними и новым. Для Apache укажите --apache вместо --nginx:

certbot --nginx --expand -d ДОМЕН -d www.ДОМЕН -d app.ДОМЕН

Что будет, если продление не удалось? Текущий сертификат действует до даты окончания срока, а таймер повторяет попытку дважды в день. Причина записана в /var/log/letsencrypt/letsencrypt.log; исправив её, проверьте результат командой certbot renew --dry-run.

Может ли AI-ассистент выполнить эти шаги за меня? Да, если у его токена есть разрешения «Читать список и статус моих серверов» (servers:read) и «Выполнять любые команды от root на моих серверах» (servers:exec). Домен к этому моменту уже должен указывать на сервер. См. Примеры задач для AI-ассистента и нужные разрешения.

Я всё сделал по шагам, но сайт так и не открывается. Пройдите по списку проверок из статьи Сайт не открывается. Если проблема останется, напишите нам: Как связаться с поддержкой BLACKBOX.

Не нашли ответ?Напишите нам — служба поддержки ответит. support@blackbox.md
Открыть тикет