VPS для веб-студии: сайты клиентов на одном сервере

Для бизнеса
VPS для веб-студии: сайты клиентов на одном сервере

Сервер для веб-студии — это момент взросления бизнеса: вместо зоопарка из десятка виртуальных хостингов с разными паролями, версиями PHP и саппортами студия собирает все сайты клиентов на одном VPS, который полностью контролирует. Это дешевле, быстрее и — при правильной настройке — безопаснее: клиенты изолированы друг от друга, а вы стандартизируете окружение и берёте деньги за обслуживание. В этой статье — экономика вопроса, схема мультисайтового Nginx, изоляция клиентов через пулы PHP-FPM и чек-лист по бэкапам и SSL.

Почему студии выгоден свой сервер, а не хостинг для каждого клиента

Посчитаем на типичной студии с 30 сайтами на поддержке. Виртуальный хостинг под каждый проект — 200–300 ₽/мес, итого 6000–9000 ₽ ежемесячно. Один VPS уровня Ultra у Cheap-Host — 20 vCPU, 32 ГБ RAM, 192 ГБ NVMe — стоит 1500 ₽/мес и спокойно тянет эти же 30 сайтов с запасом на рост. Экономия в 4–6 раз — но деньги здесь даже не главное:

  • Единое окружение. Одна версия Nginx, нужные версии PHP, один набор инструментов деплоя. Не нужно помнить особенности пятнадцати панелей разных хостеров.
  • Полный root-доступ. Можно поставить Redis для кеша, нужные PHP-расширения, настроить Brotli — на виртуальном хостинге это обычно недоступно.
  • Скорость. NVMe-диски и выделенные ресурсы KVM вместо соседей по shared-хостингу. Сайты клиентов открываются быстрее — это аргумент и для SEO, и для продления договора на поддержку.
  • Новая статья дохода. Хостинг + обслуживание сервера — регулярный платёж от каждого клиента, который окупает VPS многократно.
  • Управляемость. Развернуть тестовую копию, откатить сайт из бэкапа, посмотреть логи — всё в одном месте, без тикетов в чужую поддержку.

Если сомневаетесь между размерами сервера — начните с Pro (16 ГБ RAM, 750 ₽/мес): у Cheap-Host апгрейд CPU/RAM/диска выполняется без потери данных, так что переехать на Ultra можно в момент, когда клиентов станет больше.

Архитектура: мультисайтовый Nginx + PHP-FPM

Классическая схема для десятков сайтов на одном сервере: Nginx принимает все запросы и по имени домена (виртуальные хосты) направляет их в нужный корневой каталог, а PHP исполняется через PHP-FPM — отдельным пулом на каждого клиента. Базовую механику виртуальных хостов мы разбирали в статье «Несколько сайтов на одном VPS»; здесь соберём её в студийный стандарт.

Структура каталогов и пользователей

Главный принцип: один клиент — один Linux-пользователь. Никаких «всё лежит под www-data»:

sudo adduser --disabled-password --gecos "" client-acme
sudo mkdir -p /var/www/client-acme/site.ru/public
sudo chown -R client-acme:client-acme /var/www/client-acme
sudo chmod 750 /var/www/client-acme

Домашние каталоги клиентов закрыты от чтения другими пользователями (750), а Nginx получает доступ через членство в группе клиента:

sudo usermod -aG client-acme www-data

Виртуальный хост Nginx под сайт клиента

Файл /etc/nginx/sites-available/site.ru:

server {
    listen 80;
    server_name site.ru www.site.ru;
    root /var/www/client-acme/site.ru/public;
    index index.php index.html;

    access_log /var/log/nginx/site.ru.access.log;
    error_log  /var/log/nginx/site.ru.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/fpm-client-acme.sock;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }
}

Включаем сайт и перечитываем конфигурацию:

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

Отдельные логи на каждый домен — обязательны: когда клиент позвонит со словами «сайт тормозит», вы будете смотреть его лог, а не общую свалку.

Изоляция клиентов через пулы PHP-FPM

Это ключевая часть студийной схемы. Если все сайты работают через один пул PHP-FPM под www-data, то взлом одного WordPress означает доступ к файлам всех клиентов — включая wp-config.php с паролями от баз. Отдельный пул на клиента закрывает эту дыру: PHP-процессы каждого сайта работают от своего пользователя и физически не могут прочитать чужие каталоги.

Создаём пул — файл /etc/php/8.3/fpm/pool.d/client-acme.conf:

[client-acme]
user = client-acme
group = client-acme
listen = /run/php/fpm-client-acme.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = ondemand
pm.max_children = 8
pm.process_idle_timeout = 10s
pm.max_requests = 500

php_admin_value[open_basedir] = /var/www/client-acme:/tmp
php_admin_value[memory_limit] = 256M
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/www/client-acme/php-error.log

После правок — sudo systemctl reload php8.3-fpm. Что даёт эта конфигурация:

  • Изоляция файлов: процессы работают от client-acme, а open_basedir дополнительно запрещает PHP выходить за пределы каталога клиента.
  • Изоляция ресурсов: pm.max_children = 8 — потолок процессов на клиента. Один «раздутый» сайт не съест всю память сервера; лимиты каждого пула считаются под общий объём RAM — методику расчёта см. в статье об оптимизации PHP-FPM.
  • Экономия памяти: pm = ondemand запускает процессы только при запросах — для 30–50 сайтов, где большинство не нагружено круглосуточно, это идеальный режим.
  • Отдельные логи ошибок PHP по каждому клиенту — диагностика без археологии.

Бонус изоляции: клиентам можно выдавать SFTP-доступ к их каталогу (это их же учётка), не опасаясь за соседей. А если какому-то проекту нужна другая версия PHP — ставите php8.1-fpm рядом и создаёте пул на нём: Nginx всё равно общается с пулом через сокет.

SSL, база данных и деплой

SSL. Каждому домену — бесплатный сертификат Let's Encrypt с автопродлением: certbot --nginx -d site.ru -d www.site.ru. Подробная настройка — в статье про Let's Encrypt. Certbot сам допишет HTTPS-блоки в конфиги Nginx.

Базы данных. Тот же принцип изоляции: одна база и один пользователь MySQL на клиента, права — только на свою базу:

CREATE DATABASE acme_site CHARACTER SET utf8mb4;
CREATE USER 'acme'@'localhost' IDENTIFIED BY 'сложный_пароль';
GRANT ALL PRIVILEGES ON acme_site.* TO 'acme'@'localhost';
FLUSH PRIVILEGES;

Перенос сайтов. Переезд клиентов со старых хостингов делайте по схеме «скопировали файлы и дамп → проверили через hosts → переключили DNS» — пошагово это описано в статье о переносе сайта на VPS без простоя.

Бэкапы: ваша страховка перед клиентами

Когда сайты клиентов на вашем сервере, бэкапы — не опция, а пункт договора. Минимальная схема: ежедневный дамп всех баз и архив файлов с выгрузкой на другой сервер или в объектное хранилище. Простейший скрипт в cron:

#!/bin/bash
DATE=$(date +%F)
mkdir -p /backup/$DATE
mysqldump --all-databases --single-transaction | gzip > /backup/$DATE/all-db.sql.gz
tar -czf /backup/$DATE/www.tar.gz /var/www
find /backup -maxdepth 1 -mtime +14 -type d -exec rm -rf {} +

Хранить бэкапы только на том же VPS — не стратегия: копия обязана жить вне сервера. Дешёвое решение — NAT VPS от Cheap-Host за 59–349 ₽/мес как удалённое хранилище под rsync: за копейки вы получаете географически отдельную площадку в Германии для копий.

Сколько клиентов потянет сервер

Тариф Cheap-HostРесурсыОриентир
Start, 450 ₽/мес6 vCPU, 8 ГБ, 96 ГБ NVMe5–15 лёгких сайтов, старт студии
Pro, 750 ₽/мес12 vCPU, 16 ГБ, 128 ГБ NVMe15–30 типовых сайтов на CMS
Ultra, 1500 ₽/мес20 vCPU, 32 ГБ, 192 ГБ NVMe30–60 сайтов, включая тяжёлые WooCommerce/Битрикс

Ориентиры даны для типовых сайтов на WordPress и подобных CMS с настроенным кешированием. Реальный предел определяет не число сайтов, а суммарный трафик и два-три самых тяжёлых проекта — за ними следите отдельно через мониторинг и логи.

FAQ

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

На сервере с 32 ГБ RAM и 20 ядрами комфортно живут 30–60 типовых сайтов на CMS. Ограничивает не количество, а суммарная посещаемость и самые тяжёлые проекты.

Что будет, если один сайт клиента взломают?

При изоляции через отдельных пользователей и пулы PHP-FPM взломанный сайт не доберётся до файлов соседей: его PHP-процессы работают от своего пользователя и видят только свой каталог.

Выгоднее ли VPS, чем отдельный хостинг для каждого клиента?

Да, примерно с 5–7 сайтов. 30 хостингов по 200–300 ₽ — это 6000–9000 ₽/мес против 1500 ₽ за VPS Ultra. Плюс единое окружение и контроль версий PHP.

Нужна ли панель управления, или всё делать руками?

Для потока однотипных сайтов бесплатные панели (HestiaCP, aaPanel) экономят время. Ручная настройка даёт больше контроля и меньше лишнего софта — зависит от процессов студии.

Как переносить сайты клиентов со старых хостингов без простоя?

Скопировать файлы и базу, проверить сайт через файл hosts, затем переключить A-запись. Со сниженным заранее TTL простой практически нулевой.

Вывод

VPS для веб-студии — это контроль, экономия и новая строка дохода: все сайты клиентов на одном сервере со стандартным окружением, изоляцией через пулы PHP-FPM и вашими правилами бэкапов. Схема проверенная: мультисайтовый Nginx, один пользователь и пул на клиента, SSL от Let's Encrypt, копии — вне сервера. Если для этой задачи вам нужен сервер — у Cheap-Host есть тариф Ultra за 1500 ₽/мес: 20 vCPU, 32 ГБ RAM, 192 ГБ NVMe, KVM, безлимитный трафик и выдача за 45–60 секунд. Начать можно и со Start или Pro — апгрейд без потери данных, когда клиентов станет больше.

Читайте также