Сервер для веб-студии — это момент взросления бизнеса: вместо зоопарка из десятка виртуальных хостингов с разными паролями, версиями 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 ГБ NVMe | 5–15 лёгких сайтов, старт студии |
| Pro, 750 ₽/мес | 12 vCPU, 16 ГБ, 128 ГБ NVMe | 15–30 типовых сайтов на CMS |
| Ultra, 1500 ₽/мес | 20 vCPU, 32 ГБ, 192 ГБ NVMe | 30–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 — апгрейд без потери данных, когда клиентов станет больше.