Несколько сайтов и поддоменов на одном VPS через nginx
Один VPS легко тянет десяток сайтов: nginx разводит запросы по доменам через виртуальные хосты. Настроим два поддомена — статический сайт и проксируемое приложение — с отдельными конфигами и бесплатным HTTPS через Let's Encrypt. Никакой второй сервер не нужен.
Содержание
Как nginx разводит домены
['nginx смотрит на заголовок Host в запросе и по директиве server_name выбирает нужный блок server. Так один IP и один процесс обслуживают сколько угодно доменов и поддоменов — это называется виртуальный хостинг по имени.', 'На одном VPS MAATRIX с AMD EPYC и NVMe спокойно живут блог, лендинг и пара клиентских проектов одновременно — ресурсов ядра хватает с запасом, а быстрый диск ускоряет отдачу статики.', 'Предполагаем, что DNS-записи A для site.ru, blog.site.ru и app.site.ru уже указывают на IP вашего сервера.']Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под несколько сайтовСтруктура конфигов
['Хорошая практика — по файлу на сайт в /etc/nginx/sites-available/, а включённые ссылками в /etc/nginx/sites-enabled/. Проверяем, что nginx стоит:', 'sudo apt update && sudo apt install -y nginx\nnginx -v']
Сайт 1. Статический на поддомене
['Кладём файлы сайта и создаём конфиг /etc/nginx/sites-available/blog.site.ru:', 'sudo mkdir -p /var/www/blog/html\nsudo chown -R www-data:www-data /var/www/blog', 'server {\n listen 80;\n server_name blog.site.ru;\n root /var/www/blog/html;\n index index.html;\n\n location / {\n try_files $uri $uri/ =404;\n }\n\n access_log /var/log/nginx/blog.access.log;\n error_log /var/log/nginx/blog.error.log;\n}']
Сайт 2. Проксирование приложения
['Второй поддомен — приложение на локальном порту (например, Node или Gunicorn на 127.0.0.1:8000). Конфиг /etc/nginx/sites-available/app.site.ru:', 'server {\n listen 80;\n server_name app.site.ru;\n\n location / {\n proxy_pass http://127.0.0.1:8000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n}', 'Заголовки X-Forwarded-* передают приложению реальный IP клиента и протокол — без них приложение будет видеть все запросы как локальные.']
Включаем и проверяем
['Активируем оба конфига симлинками, проверяем синтаксис и перезагружаем nginx:', 'sudo ln -s /etc/nginx/sites-available/blog.site.ru /etc/nginx/sites-enabled/\nsudo ln -s /etc/nginx/sites-available/app.site.ru /etc/nginx/sites-enabled/\nsudo nginx -t\nsudo systemctl reload nginx', 'nginx -t обязательна перед reload: она ловит опечатки в конфиге, чтобы перезагрузка не уронила все сайты сразу.']
Бесплатный HTTPS через certbot
["Let's Encrypt выдаёт бесплатные сертификаты, а плагин certbot для nginx сам правит конфиги под HTTPS:", 'sudo apt install -y certbot python3-certbot-nginx\nsudo certbot --nginx -d blog.site.ru -d app.site.ru', 'certbot добавит блоки listen 443 ssl, редирект с 80 на 443 и настроит автопродление через systemd-таймер. Проверить продление:', 'sudo certbot renew --dry-run']
Частые ошибки
['- Открывается не тот сайт — нет подходящего server_name, и запрос попадает в дефолтный блок. Проверьте, что домен совпадает точно.
- 502 Bad Gateway на проксируемом сайте — приложение не запущено или слушает другой порт/адрес.
- certbot не может выдать сертификат — DNS ещё не указывает на сервер или 80-й порт закрыт файрволом.
- Забыли nginx -t и словили reload с ошибкой — упали все сайты; всегда тестируйте конфиг перед перезагрузкой.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под несколько сайтовЧастые вопросы
Сколько сайтов потянет один VPS?
Для статики и небольших приложений — десятки. Упрётесь не в nginx, а в память и CPU конкретных приложений; на AMD EPYC у MAATRIX запас большой.
Нужен ли отдельный IP на каждый поддомен?
Нет. Виртуальный хостинг по имени обслуживает все домены на одном IP — nginx различает их по заголовку Host.
Как получить HTTPS сразу на все поддомены?
Перечислите их флагами -d в одной команде certbot либо используйте wildcard-сертификат через DNS-валидацию для *.site.ru.