Для контекста: я использую сервер Debian или Ubuntu с Apache 2.4, PHP 7.2 и рядом других вещей, чтобы настроить среду разработки и тестирования для разработчиков и технических специалистов, которые могут использовать ее на работе.
Я следил заучебник по массовому виртуальному хостуиспользуя mod_vhost_alias
, чтобы я мог получить что-то вроде этого:
path: /var/www/{projectname}/public
url: {projectname}.dev.mycompany.net
Соответствующая конфигурация выглядит следующим образом (соответствующим образом отредактировано):
VirtualDocumentRoot /var/www/%-4/public
ServerName dev.mycompany.net
ServerAlias *.dev.mycompany.net
UseCanonicalName Off
Теперь все это работает правильно, и разработчики могут легко запустить свои собственные проекты, запросив пользователя; пользователь создается и добавляется в www-data
группу, а затем в /var/www создаются соответствующие папки со следующей структурой:
projectname:projectname rwxrwxr-x /var/www/projectname
www-data:www-data rwxrwsr-x /var/www/projectname/public
setfacl -m user:www-data:rwx /var/www/projectname
setfacl -R -m user:projectname:rwx /var/www/projectname/public
(последнее было необходимо для того, чтобы файлы, созданные, например, установленными фреймворками или распаковщиками, могли фактически обрабатываться веб-сервером)
Конечно, это имеет тот недостаток, что любой проект может писать вещи в любой другой проект, поэтому я хочу работать над этим. Однако я хочу, где это возможно,держатьавтоматизация, поскольку разработчики и технические специалисты должны иметь возможность запускать проекты с минимальным участием бэкенда в этом вопросе («Отвлекающий бэкенд останется на потом», — сказал босс).
Теперь, чтобы сделать вещи безопасными, но при этом сохранить простоту, я хочу настроить Apache (или PHP?) так, чтобы соответствующий пользователь использовался для выполнения процесса веб-сервера / PHP, соответствующего каждому виртуальному хосту. Это означает, что, например: проект /var/www/foo1
запускается под пользователем foo1
и не имеет доступа к файлам под /var/www/foo2
. Конечно, я ожидаю адаптировать разрешения и ACL к этому.
Но я не могу найти никакой документации о том, как настроить отдельных пользователей, покадержаться рядомавтоматизация для массового виртуального хоста. Я предполагаю, что это должно существовать — хостинговые компании в конце концов делают такие вещи. Но я рассмотрел множество вещей, и ничто не предлагает работающей альтернативы.
В лучшем случае мне посоветовали apache2-mod-itk, но после установки веб-сервер всегда отказывается запускаться, несмотря ни на что, даже если сбросить большинство файлов конфигурации до конфигурации по умолчанию, так что это не вариант.
Я ищу что-то, что имело бы эффект, аналогичный этому «псевдокоду» конфигурации Apache:
<Virtualhost *:443>
VirtualDocumentRoot /var/www/%-4/public
ServerName dev.mycompany.net
ServerAlias *.dev.mycompany.net
UseCanonicalName Off
User %-4
Group %-4
SuexecUserGroup %-4
CustomLog /var/www/%-4/logs/access.log vcommon
[...other directives]
</Virtualhost>
Есть ли что-то подобное в Apache/+PHP или мне следует поискать другое автоматизированное решение?
Обратите внимание, что янехотите в конечном итоге разделить все это на, например, docker или VM для каждого пользователя, если только не существует простого способа автоматизации настройки, подобного mass_vhosts; это потребовало бы еще больше ввода (не говоря уже о предоставлении техническим специалистам прав root(?) для запуска и установки контейнеров docker), а также нарушило бы автоматизацию (как динамически подключать поддомены к контейнерам?).