MAATRIX / Блог / Несколько сайтов на одном VPS

Несколько сайтов на одном VPS

Несколько сайтов на одном VPS: virtual hosts в nginx
Блог MAATRIX · 2026-07-07

Один VPS легко держит десяток сайтов — платить за отдельный сервер под каждый проект не нужно. Секрет в виртуальных хостах nginx: сервер по имени домена решает, какой сайт отдать. Разберём, как настроить это чисто и безопасно.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Как один сервер обслуживает много доменов

Все домены указывают A-записью на один IP. Приходит запрос — nginx смотрит заголовок Host и по нему выбирает нужный server-блок. Каждому сайту — свой каталог, свой конфиг, свой SSL.

Сколько сайтов потянет VPS? Десяток лёгких визиток и лендингов спокойно живут на тарифе от $8/мес. На NVMe у MAATRIX отдача статики и работа баз идут быстро даже при нескольких проектах на одном ядре.

Экономика очевидна: вместо трёх-пяти отдельных хостингов вы платите за один сервер, а управляете всем из одной SSH-сессии. Обновление PHP, настройка фаервола, мониторинг — всё в одном месте. Минус тоже есть: сайты делят ресурсы, поэтому один тяжёлый проект способен притормозить соседей. Именно поэтому ниже мы разграничиваем не только конфиги, но и пулы процессов, и лимиты по памяти.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для нескольких сайтов

Структура каталогов

Держите сайты раздельно — это упрощает бэкапы и разграничение прав:

/var/www/
├── shop.ru/
├── blog.ru/
└── portfolio.ru/
mkdir -p /var/www/{shop.ru,blog.ru,portfolio.ru}
chown -R www-data:www-data /var/www

Server-блок под каждый сайт

На каждый домен — отдельный файл в /etc/nginx/sites-available/. Пример для первого сайта:

server {
    listen 80;
    server_name shop.ru www.shop.ru;
    root /var/www/shop.ru;
    index index.php index.html;

    location / { try_files $uri $uri/ /index.php?$args; }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm-shop.sock;
    }
    access_log /var/log/nginx/shop.access.log;
}

Активируем и перезагружаем nginx:

ln -s /etc/nginx/sites-available/shop.ru /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Обратите внимание на директиву fastcgi_pass: у каждого сайта она указывает на свой сокет php-fpm (php8.2-fpm-shop.sock). Именно это связывает домен с изолированным пулом процессов, который мы заведём ниже. Команда nginx -t перед каждым reload — обязательная привычка: она ловит опечатки в конфиге до применения, чтобы кривая правка на одном сайте не уронила все остальные разом.

Отдельный пул PHP-FPM на сайт

Чтобы падение одного сайта не тянуло за собой остальные, дайте каждому свой пул PHP-FPM. Создайте /etc/php/8.2/fpm/pool.d/shop.conf:

[shop]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm-shop.sock
pm = dynamic
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4
systemctl restart php8.2-fpm

Так проблемный сайт исчерпает только свой лимит процессов, а соседи продолжат работать.

Свой SSL на каждый домен

Certbot умеет выпускать сертификаты сразу на несколько доменов одной командой:

certbot --nginx -d shop.ru -d www.shop.ru \
        -d blog.ru -d www.blog.ru \
        -d portfolio.ru -d www.portfolio.ru

Каждый сайт получит валидный HTTPS, автопродление настроится автоматически. Если добавляете новый домен позже — просто дозапускаете certbot с флагом -d newdomain.ru, старые сертификаты при этом не трогаются.

Важный нюанс: по умолчанию nginx отдаёт первый по алфавиту server-блок как «дефолтный», если запрос пришёл с неизвестным Host. Чтобы чужие боты не цеплялись к случайному сайту, заведите заглушку с default_server, возвращающую 444:

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Ресурсы и разграничение

  • Следите за памятью: pm.max_children у всех пулов в сумме не должен превышать RAM. Один PHP-воркер ест 30–60 МБ.
  • Разные базы — разным пользователям MySQL, чтобы утечка на одном сайте не открыла доступ к остальным.
  • Смотрите нагрузку по каждому сайту через отдельные access_log.

Когда одному проекту станет тесно, его легко вынести на второй VPS — конфиг уже изолирован.

Для наглядности держите единую схему именования: каталог /var/www/домен, конфиг nginx с таким же именем, пул php-fpm и лог с тем же префиксом. Через полгода, когда сайтов станет много, вы мгновенно найдёте всё, что относится к конкретному проекту, а не будете распутывать безымянные site1, site2, test_final.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для нескольких сайтов

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

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

Сколько сайтов выдержит один VPS?

Зависит от нагрузки: десяток визиток и блогов — легко на тарифе от $8/мес, а два-три нагруженных магазина лучше держать на более мощной конфигурации или разнести по серверам.

Зачем каждому сайту свой пул PHP-FPM?

Для изоляции: если один сайт исчерпает лимит процессов или зависнет, остальные продолжат работать, потому что используют собственные воркеры.

Можно ли смешивать сайты на PHP и, например, Node.js?

Да. nginx проксирует PHP на php-fpm, а Node-приложение — на его порт через proxy_pass. Домены при этом делят один сервер.