Назад | Перейти на главную страницу

mod_vhost_alias + suEXEC: автоматический выбор uid / gid

Я пытаюсь настроить Debian 6.0.4 для массового виртуального хостинга с PHP5. Пакеты apache2-mpm-worker libapache2-mod-fcgid apache2-suexec установлены.

Я успешно загрузил mod_vhost_alias и suexec чтобы управлять моими доменами по каталогам, я поместил эту конфигурацию в /etc/apache2/sites-enabled/001-vhostalias:

NameVirtualHost *:80
ServerName web-test.mynet.lan
DocumentRoot /var/www/

SuexecUserGroup www-data www-data    

UseCanonicalName    Off
VirtualDocumentRoot /var/www/www.%2+/public_html/
VirtualScriptAlias /var/www.%2+/cgi-bin/

DirectoryIndex index.html index.htm index.shtml index.php   

ScriptAlias /__php5-cgi/ "/usr/local/lib/custom-cgi/php5-cgi/"
Action php5-script /__php5-cgi/php5-cgi
AddHandler php5-script .php

При этом выше, стр. е., размещение домена с именем www.test-a.com потребности:

Без suEXEC я сделал несколько простых тестов PHP, он отлично работает как uid / gid www-data. Но теперь мне нужно включить suEXEC для изоляции доменов ...

Вопрос в том: как я могу сказать suEXEC чтобы автоматически получить правильный uid / gid?

Я использую конфигурацию suEXEC по умолчанию:

root@web-test:/var/www# /usr/lib/apache2/suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

Но вылетает:

root@web-test:/var/www# tail /var/log/apache2/suexec.log 
[2012-05-05 18:31:48]: cannot run as forbidden uid (33/php5-cgi)
[2012-05-05 18:34:24]: uid: (33/www-data) gid: (33/www-data) cmd: php5-cgi

Примечание: Я раньше использовал apache2-mpm-itk но он довольно нестабилен после 400-500 определений VirtualHost, особенно он падает на apache2ctl restart|graceful".

Спасибо

Предлагаю использовать mpm-itk

Package: apache2-mpm-itk
Description: multiuser MPM for Apache 2.2
 The ITK Multi-Processing Module (MPM) works in about the same way as the classical "prefork" module (that is, without threads),
 except that it allows you to constrain each individual vhost to a particular system user. This allows you to run several different
 web sites on a single server without worrying that they will be able to read each others' files. This is a third-party MPM that is
 not included in the normal Apache httpd.

 Please note that this MPM is somewhat less tested than the MPMs that come with Apache itself.

С дополнительным патч вы можете назначать uid / gid динамически. Я без проблем использую такое решение около 2 лет.

<VirtualHost *:80>
    ServerName www.example.net
    ServerAlias *.example.net
    UseCanonicalName Off

    VirtualDocumentRoot /vhosts/example.net/%1
    DirectoryIndex index.php index.html

    AssignUserFromPath "^/vhosts/example.net/([^/]+)" mvh_$1 mvh_$1

    <Directory /vhosts/example.net>
        Options -Indexes +Includes
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

В SuexecUserGroup Директива, похоже, не поддерживает переменные, поэтому нет простого способа делать то, что вы хотите. Это сообщение в списке рассылки также говорит, что это невозможно, и что CGIwrap следует использовать вместо этого. Единственный другой подход, который я могу придумать, - это злоупотребление suEXEC mod_userdir интеграция и как-то переписывать запросы в каталог пользователя, но вряд ли это сработает.