Сайт на VPS: настройка Nginx и Let's Encrypt SSL
Направьте домен на VPS, установите Nginx, опубликуйте сайт и получите бесплатный сертификат Let's Encrypt через Certbot. Пошаговое руководство для Ubuntu 24.04.
Собственный VPS даёт гораздо больше свободы, чем виртуальный хостинг: вы сами решаете, какое ПО работает на сервере, как устроено кэширование и как обновляются сертификаты. В этом руководстве мы шаг за шагом разберём установку Nginx на Ubuntu 24.04, публикацию первого сайта и получение бесплатного SSL-сертификата Let's Encrypt через Certbot. В итоге у вас будет сайт на VPS, который открывается по HTTPS и сам продлевает сертификат.
Во всех примерах используется домен example.com — замените его на свой. Предполагается, что вы работаете под пользователем с правами sudo.
Что понадобится
- VPS с Ubuntu 24.04 и доступом по SSH (если SSH для вас в новинку, загляните в статью Что такое SSH).
- Доменное имя и доступ к управлению его DNS-записями.
- Публичный IP-адрес сервера.
Шаг 1. Направьте DNS-записи на сервер
Let's Encrypt проверяет домен, обращаясь к нему по HTTP, поэтому домен должен указывать на ваш сервер до запроса сертификата. Создайте у DNS-провайдера записи:
| Тип | Имя | Значение |
|---|---|---|
| A | @ | IPv4-адрес сервера |
| A | www | IPv4-адрес сервера |
| AAAA | @ и www | IPv6-адрес (если есть) |
Как работает DNS, подробно рассказано в статье Что такое DNS. Проверить, обновились ли записи, можно так:
dig +short example.com A
dig +short www.example.com A
dig +short example.com AAAA
Если в ответе IP вашего сервера — можно продолжать. Пустой ответ или старый IP означает, что нужно немного подождать. Важно: не добавляйте AAAA-запись, если у сервера нет этого IPv6-адреса или Nginx не слушает IPv6, — иначе проверка может уйти не туда.
Шаг 2. Установка Nginx
Обновите список пакетов и установите Nginx:
sudo apt update
sudo apt install -y nginx
Служба запускается автоматически. Проверьте статус:
systemctl status nginx --no-pager
Если видите active (running), то по адресу http://IP_СЕРВЕРА в браузере откроется стандартная страница приветствия Nginx.
Шаг 3. Откройте HTTP и HTTPS в файрволе
Если используете UFW, откройте порты 80 и 443, не забыв про SSH:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Профиль Nginx Full открывает сразу 80/tcp и 443/tcp. Никогда не включайте UFW без правила OpenSSH — можно потерять доступ к серверу. Остальные базовые меры защиты собраны в чек-листе Безопасность Linux-сервера.
Шаг 4. Каталог для сайта
Отдельный каталог для каждого сайта упростит размещение нескольких проектов на одном сервере:
sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
echo '<h1>example.com работает</h1>' > /var/www/example.com/html/index.html
Позже сюда можно загрузить файлы сайта через scp, rsync или Git.
Шаг 5. Настройка server block в Nginx
В Nginx каждый сайт описывается блоком server. Создайте файл конфигурации:
sudo nano /etc/nginx/sites-available/example.com
Вставьте:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Активируйте конфигурацию символической ссылкой. Если сайт по умолчанию не нужен, отключите его:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
После каждого изменения сначала проверяйте конфигурацию, затем перезагружайте:
sudo nginx -t
sudo systemctl reload nginx
Делайте reload только после сообщений syntax is ok и test is successful. Теперь по адресу http://example.com должна открываться ваша страница.
Шаг 6. Бесплатный SSL Let's Encrypt через Certbot
Let's Encrypt — центр сертификации, который бесплатно выдаёт сертификаты сроком на 90 дней. Зачем нужен SSL, мы объясняли в статье Что такое SSL-сертификат. Установите Certbot и плагин для Nginx из репозиториев Ubuntu:
sudo apt install -y certbot python3-certbot-nginx
Примечание: разработчики Certbot рекомендуют snap-пакет с самой свежей версией (
sudo snap install --classic certbot). Пакета из репозитория Ubuntu хватает для большинства задач — ставьте что-то одно.
Получите сертификат:
sudo certbot --nginx -d example.com -d www.example.com
При первом запуске Certbot попросит e-mail и согласие с условиями. Затем он проверит домен, выпустит сертификат и добавит в ваш server block директивы listen 443 ssl. Свежие версии Certbot сами добавляют редирект с HTTP на HTTPS; старые задают вопрос — выберите «redirect».
Проверьте результат:
curl -I http://example.com
curl -I https://example.com
Первая команда должна вернуть 301 Moved Permanently с переходом на HTTPS, вторая — 200 OK.
Шаг 7. Проверьте автопродление
Certbot создаёт таймер systemd, который продлевает сертификаты до истечения срока. Проверьте таймер и сымитируйте продление:
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
У snap-версии таймер называется snap.certbot.renew.timer. Если пробный прогон прошёл без ошибок, больше ничего делать не нужно.
Бонус: Nginx как обратный прокси
Если у вас приложение на Node.js, Python или в Docker-контейнере на порту 3000, поставьте перед ним Nginx и завершайте SSL на нём. Замените блок location /:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Заголовки Upgrade и Connection нужны приложениям с WebSocket. Пусть приложение слушает только 127.0.0.1 — тогда порт 3000 будет закрыт снаружи. Если вы только знакомитесь с контейнерами, начните с нашего руководства Установка Docker.
Частые ошибки
Certbot пишет «Timeout during connect» или «Connection refused». Порт 80 недоступен извне. Проверьте файрвол (sudo ufw status) и то, что Nginx слушает порт: sudo ss -tlnp | grep :80.
«NXDOMAIN» или неверный IP. DNS ещё не обновился или настроен неправильно. Повторите dig +short; удалите AAAA-запись, если она указывает на чужой IPv6.
«too many certificates already issued». Вы упёрлись в лимиты Let's Encrypt. Экспериментируйте с --dry-run или --staging и дождитесь сброса лимита.
502 Bad Gateway. При работе через прокси приложение не запущено или слушает другой порт. Проверьте его напрямую: curl http://127.0.0.1:3000, и посмотрите sudo tail -n 50 /var/log/nginx/error.log.
Сайт перестал открываться после правки. Выполните sudo nginx -t — в сообщении обычно указаны файл и номер строки.
Часто задаваемые вопросы
Сертификат Let's Encrypt действительно бесплатный?
Да. Let's Encrypt бесплатно выдаёт сертификаты с проверкой домена (DV). Срок действия — 90 дней, но Certbot продлевает их автоматически, а браузеры доверяют им так же, как платным DV-сертификатам.
Можно ли разместить несколько сайтов на одном VPS?
Да. Для каждого сайта создайте отдельный каталог в /var/www и отдельный server block в /etc/nginx/sites-available, затем выполните certbot --nginx -d ваш-домен для каждого. Ограничение — только RAM и процессор сервера.
Почему Nginx, а не Apache?
Nginx отдаёт статику и держит много одновременных соединений при небольшом расходе памяти, а ещё это самый популярный обратный прокси — на небольшом VPS это заметное преимущество. Если приложение завязано на правила .htaccess, Apache по-прежнему хороший выбор.
Разместите сайт на VPS в Турции
Всё описанное выше спокойно работает даже на самых младших тарифах. VPS от TürkiyeVPS — это сервер в Стамбуле от $0.89 в месяц с Ubuntu 24.04 или Debian 12, полным root-доступом и безлимитным трафиком; сервер создаётся автоматически сразу после подтверждения оплаты. Для нагруженных проектов посмотрите VDS с выделенными vCPU. Если что-то не получается, напишите нам в онлайн-чат на сайте или создайте тикет в поддержку.
Читайте также
Если на VPS с 512 МБ или 1 ГБ RAM падают приложения, swap — первая помощь. Как добавить swap в Ubuntu 24.04, в...
Бот не должен засыпать вместе с ноутбуком. Пошагово: запуск Telegram-бота на Python 24/7 на VPS с Ubuntu 24.04...
Собираетесь запустить сервер Metin2, но не знаете, хватит ли VPS или нужен VDS? Сравниваем общий и выделенный...