Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt
Установка nginx или Apache, настройка сайта для вашего домена и получение бесплатного сертификата Let's Encrypt с помощью certbot.
На этой странице
Это руководство показывает, как разместить сайт на сервере 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
Установите nginx. Служба запустится автоматически после установки.
apt update apt install -y nginxСоздайте каталог сайта и тестовую страницу:
mkdir -p /var/www/ДОМЕН echo "ДОМЕН OK" > /var/www/ДОМЕН/index.htmlСоздайте файл конфигурации сайта:
nano /etc/nginx/sites-available/ДОМЕНВставьте содержимое ниже, сохраните (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; } }Включите сайт:
ln -s /etc/nginx/sites-available/ДОМЕН /etc/nginx/sites-enabled/Проверьте конфигурацию и перезагрузите её. Команда
nginx -tдолжна вывести «syntax is ok» и «test is successful»; если появилась ошибка, исправьте файл до перезагрузки.nginx -t systemctl reload nginx
AlmaLinux и CentOS Stream
Установите и запустите nginx:
dnf install -y nginx systemctl enable --now nginxСоздайте каталог сайта и тестовую страницу, затем назначьте файлам метку SELinux для веб-содержимого: на файлы без неё nginx отвечает «403 Forbidden». Запускайте
restoreconснова и после того, как переместите (mv) в каталог файлы из другого места.mkdir -p /var/www/ДОМЕН echo "ДОМЕН OK" > /var/www/ДОМЕН/index.html restorecon -Rv /var/wwwСоздайте файл конфигурации (если
nanoнет, первая команда его установит):dnf install -y nano nano /etc/nginx/conf.d/ДОМЕН.confВставьте тот же блок
server { … }, что и для Ubuntu и Debian, сохраните и выйдите.Проверьте конфигурацию и перезагрузите её:
nginx -t systemctl reload nginx
Вариант 2: Apache
Ubuntu и Debian
Установите Apache. Служба запустится автоматически после установки.
apt update apt install -y apache2Создайте каталог сайта и тестовую страницу командами из шага 2 варианта nginx.
Создайте файл конфигурации сайта:
nano /etc/apache2/sites-available/ДОМЕН.confВставьте содержимое ниже, сохраните и выйдите:
<VirtualHost *:80> ServerName ДОМЕН ServerAlias www.ДОМЕН DocumentRoot /var/www/ДОМЕН ErrorLog ${APACHE_LOG_DIR}/ДОМЕН-error.log CustomLog ${APACHE_LOG_DIR}/ДОМЕН-access.log combined </VirtualHost>Включите сайт, проверьте конфигурацию и перезагрузите её. Команда
apachectl configtestдолжна вывести «Syntax OK».a2ensite ДОМЕН.conf apachectl configtest systemctl reload apache2
AlmaLinux и CentOS Stream
Установите Apache (
httpd) и модуль HTTPS (mod_ssl, он нужен certbot), затем запустите службу:dnf install -y httpd mod_ssl systemctl enable --now httpdСоздайте каталог сайта и тестовую страницу командами из шага 2 варианта nginx, включая
restorecon.Создайте файл конфигурации сайта (если
nanoнет, установите его, как в шаге 3 варианта nginx):nano /etc/httpd/conf.d/ДОМЕН.confВставьте блок
<VirtualHost *:80>из раздела для Ubuntu и Debian, изменив пути к журналам на/var/log/httpd/ДОМЕН-error.logи/var/log/httpd/ДОМЕН-access.log. Сохраните и выйдите.Проверьте конфигурацию и перезагрузите её:
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-nginxAlmaLinux и 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Получение сертификата
Запустите certbot с плагином вашего веб-сервера. Для nginx:
certbot --nginx -d ДОМЕН -d www.ДОМЕНДля Apache:
certbot --apache -d ДОМЕН -d www.ДОМЕНПри первом запуске certbot попросит адрес email и согласие с условиями Let's Encrypt: введите адрес и ответьте
Y. На вопрос о рассылке EFF можно ответитьN.Если certbot спросит, перенаправлять ли HTTP на HTTPS (так делают старые версии), выберите «2: Redirect». Новые версии добавляют перенаправление без вопроса.
В конце появится сообщение, которое начинается с «Congratulations!». Сертификат и ключ лежат в
/etc/letsencrypt/live/ДОМЕН/, а certbot добавил в конфигурацию сайта блок HTTPS (порт 443) и перенаправление с HTTP.Откройте
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, выполните шаги ниже вместо шагов из раздела «Получение сертификата».
В аккаунте Cloudflare создайте токен только для certbot: «My Profile» → «API Tokens» → «Create Token» → шаблон «Edit zone DNS». В «Zone Resources» выберите только зону
ДОМЕН, создайте токен и скопируйте его. Не используйте токен, подключённый на странице «DNS» панели: отдельный токен можно отозвать, не затрагивая панель.Установите плагин Cloudflare. Ubuntu и Debian:
apt install -y python3-certbot-dns-cloudflareAlmaLinux и 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.
Сохраните токен в файл:
mkdir -p /root/.secrets nano /root/.secrets/cloudflare.iniСодержимое файла — с вашим токеном вместо
ТОКЕН_CLOUDFLARE:dns_cloudflare_api_token = ТОКЕН_CLOUDFLAREСделайте файл доступным только для root:
chmod 600 /root/.secrets/cloudflare.iniПолучите сертификат.
--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"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;.Для 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
- Для первого выпуска оставьте записи
ДОМЕНиwwwв режиме «DNS only» (на странице «DNS» панели флажок «Прокси» снят) или используйте проверку через DNS, описанную выше. - Когда сайт заработает по HTTPS напрямую на сервере, включите прокси.
- В аккаунте Cloudflare, в разделе «SSL/TLS», выберите режим шифрования «Full (strict)». Режим «Flexible» приводит к бесконечным перенаправлениям, потому что сервер перенаправляет HTTP на HTTPS.
Подробнее о прокси: Как направить домен на сервер.
Что дальше
- Установите WordPress на этот сервер: WordPress на LEMP (nginx, MariaDB, PHP).
- Опубликуйте приложение на Node.js или Python через nginx: Приложения Node.js, Python и другие сервисы: nginx как обратный прокси.
- Загрузите файлы сайта в
/var/www/ДОМЕН: Передача файлов на сервер (scp, rsync, SFTP). - Следите за продлением: примерно через два месяца
certbot certificatesдолжна показать новую дату окончания срока. Если дата не изменилась, проверьте таймер и журнал certbot.
Частые вопросы
Можно ли разместить несколько сайтов на одном сервере?
Да. Для каждого домена создайте отдельный каталог и отдельный файл конфигурации (блок 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.