Часто возникает необходимость организовать обработку запросов веб-сервером с различным парами uid/gid, в зависимости от виртуального хоста или даже пути. В определённых ситуациях можно использовать MPM-ITK, который замечательно работает на большинстве популярных платформ, хотя и не отличается высокой производительностью.
Но что делать если нам нужна производительность? Тут нам на помощь придёт mod_ruid2, который заметно быстрее, хотя и работает только на Linux, так как завязан на ряд специфичных для Linux технологий. Далее будет показано как можно настроить mod_ruid2 на хостинге под управлением Ubuntu LTS.
По сравнению с mpm-itk mod_ruid2 позволяет использовать Keep-Alive соединения между браузером и веб-сервером, а при использовании mod_php можно будет использовать устойчивые ("persistent") соединения с MySQL, memcached и проч.
Всё написанное далее проверено на Ubuntu 14.04 с установленным apache2, работающем в режиме prefork (установлен модуль apache2-mpm-prefork).
Переходим к установке и настройке. Для начала установим модуль ruid2:
apt-get install libapache2-mod-ruid2
Теперь нужно добавить в файл /etc/apache2/apache2.conf "дефолтные" настройки, которые будут применяться если не указано другого. Это делается добавлением в указанный файл строки:
RUidGid ${APACHE_RUN_USER} ${APACHE_RUN_GROUP}
И наконец в конфигурации виртуальных хостов добавить строки вида:
RUidGid someuser somegroup
Например вот так:
<VirtualHost *:80> ServerAdmin webmaster@somedomain.com ServerName somedomain.com ServerAlias www.somedomain.com RUidGid webadmin admins DocumentRoot /var/www/somedomain.com/html <Directory /var/www//somedomain.com/html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/somedomain.com-error.log LogLevel warn CustomLog /var/log/apache2/somedomain.com-access.log combined </VirtualHost>
И после этого остаётся перезапустить веб-сервер:
invoke-rc.d apache2 reload
Если установлен и настроен mod_php то проверить работу можно загрузив на сервер PHP-скрипт:
<php print `id`;
При открытии этого скрипта в браузере вы должны будете увидеть примерно такой текст:
uid=1002(webadmin) gid=1000(admins) groups=1000(admins),33(www-data)
Здесь uid и gid должны соответствовать тем, которые указаны для этого виртуального хоста с помощью директивы RUidGid. Если же будет что-то другое то надо ещё раз проверить все настройки.
Приятной работы!