Открыть второй сайт на сервере несложно. Добавил домен, создал каталог, настроил веб-сервер — и страница работает. Но открывающаяся страница ещё не говорит, что сайты правильно разделены.
При настройке своего веб-сервера я уделил внимание тому, от чьего имени работают приложения и к каким файлам они имеют доступ. Мне важно, чтобы соседство на одной машине не означало общий доступ ко всем проектам.
Разные папки — ещё не разделение
Два сайта могут лежать в разных каталогах, но выполнять PHP-код от одного системного пользователя. Тогда права этого пользователя определяют возможности обоих приложений.
Если он может читать конфигурации соседнего проекта, такое же чтение может оказаться доступным и коду сайта. А в конфигурациях обычно находятся параметры подключения к базе данных и другие служебные сведения.
Поэтому для независимых проектов я выбрал отдельных владельцев. У каждого сайта появились собственные пользователь и группа, каталоги, учётная запись базы данных и PHP-FPM-пул.
В Virtualmin такие проекты создаются как отдельные Virtual Server верхнего уровня. Это окружения сайтов внутри существующей виртуальной машины.
От чьего имени работает PHP
PHP-FPM исполняет код сайта в процессах, объединённых в пул. В моей настройке каждый независимый проект использует свой пул и своего пользователя.
Это связывает работу приложения с его правами на сервере. Проект получает доступ к собственным файлам, а приватные каталоги соседнего владельца должны оставаться закрытыми.
Разделены и временные файлы с сессиями. Когда у приложения есть собственные служебные каталоги, проще понять, кому принадлежат данные и что можно очищать при обслуживании.
Для баз данных действует похожее правило: каждому проекту — отдельная учётная запись с доступом к его базам. Пароль от одной базы не должен давать доступ ко всем остальным.
Что проверили на практике
После настройки создали временный независимый сайт. Он понадобился, чтобы проверить ограничения со стороны приложения.
Проверка показала:
- собственная база данных доступна, чужие таблицы — нет;
- приватные файлы соседнего владельца прочитать нельзя;
- подключиться к PHP-FPM-сокету другого проекта нельзя;
- заданные администратором ограничения PHP не отменяются из кода сайта.
Доступ проверили в обе стороны. Затем временный проект, его базу и учётные записи удалили.
Для меня это полезнее, чем просто увидеть разных пользователей в панели. Настройка должна выдерживать попытку сделать то, что она запрещает.
Ограничения ресурсов тоже нужны
Для новых сайтов подготовлен шаблон с дисковой квотой и ограничениями PHP. Эти параметры помогают заранее определить, сколько места может занимать проект и сколько PHP-процессов ему доступно.
Но важно понимать пределы каждого ограничения. Квота защищает от бесконтрольного заполнения диска, а лимит памяти PHP относится к выполнению запроса. Они не ограничивают автоматически всю нагрузку приложения на сервер.
Поэтому значения можно менять под конкретный проект, а состояние общей машины всё равно нужно контролировать.
Когда несколько доменов относятся к одному сайту
Отдельный пользователь нужен независимому проекту. Если два домена открывают один сайт, разделять их на разные окружения только ради количества адресов нет необходимости.
В моей установке такие домены используются как алиасы одного проекта. Они работают с общими материалами и одним владельцем.
Что остаётся общим
Несмотря на разделение пользователей и PHP-пулов, сайты продолжают жить внутри одной виртуальной машины. У них общие Nginx, сервер баз данных, ядро, процессор и оперативная память.
Остановка общей службы может затронуть несколько проектов сразу. Отдельные владельцы этого не предотвращают.
Такая настройка дала мне понятные границы между сайтами. Теперь новый проект получает своё окружение, а доступ к соседним данным проверяется отдельно. Для более строгого разделения уже нужно рассматривать отдельные виртуальные машины и самостоятельные ограничения ресурсов.
