В этом руководстве, я опишу как устанавливать Apache2 с mod_fcgid и PHP5 в Debian Lenny. Модуль mod_fcgid – это альтернатива более старому mod_fastcgi, совместимая с ним. Он позволяет вам выполнять сценарии PHP с правами их владельцев, а не пользователя, от имени которого запущен Apache.
Все действия по настройке я провожу под рутом, использую сервер Debian Lenny с именем хоста server1.example.com и IP-адресом 192.168.0.1.
1. Установка Apache2/mod_fcgid/PHP5.
Устанавливаем Apache2, mod_fcgid и PHP5:
server1:/# apt-get install apache2 apache2-suexec libapache2-mod-fcgid php5-cgi
Включаем следующие модули:
server1:/# a2enmod rewrite server1:/# a2enmod suexec server1:/# a2enmod include server1:/# a2enmod fcgid
Добавляем в файл /etc/php5/cgi/php.ini строку cgi.fix_pathinfo = 1:
server1:/# echo "cgi.fix_pathinfo = 1" >> /etc/php5/cgi/php.ini
Перегружаем Apache:
server1:/# /etc/init.d/apache2 force-reload
2. Настройка виртуальных хостов.
Создадим пару виртуальных хостов vs1.example.com (корневая директория /var/www/vs1.example.com/public_html) и vs2.example.com (корневая директория /var/www/vs2.example.com/public_html). Хост vs1.example.com будет принадлежать пользователю и группе web1, а vs2.example.com – web2.
Создаем группы пользователей:
server1:/# groupadd web1 server1:/# groupadd web2
Подразумевается, что пользователи смогут заходить и заливать свои данные через SSH. Создаем пользователей:
server1:/# adduser --home /var/www/vs1.example.com --ingroup web1 web1 server1:/# adduser --home /var/www/vs2.example.com --ingroup web2 web2
В обоих случаях создаем пароли пользователям.
Запускать PHP мы будем с помощью suExec. Корневым каталогом для suExec является /var/www, в чём можно убедиться, запустив следующую команду:
server1:/# /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"
По этой причине мы не сможем вызвать интерпретатор PHP (/usr/lib/cgi-bin/php) непосредственно, поскольку размещается он за пределами корневого каталога suExec. Поскольку suExec не позволяет использование символьных ссылок, то единственным способом решить эту проблему будет создание скрипта-обёртки для каждого веб-сайта в подкаталогах каталога /var/www. Единственной задачей скрипта-обёртки будет запуск двоичного файла /usr/lib/cgi-bin/php. Этот скрипт должен принадлежать тому пользователю и группе, которые являются владельцами соответствующего веб-сайта, поэтому нам понадобятся отдельные скрипты для каждого сайта. Cкрипты-обёртки разместим в подкаталогах каталога /var/www, а именно в /var/www/vs1.example.com/public_html/cgi-bin и в /var/www/vs2.example.com/public_html/cgi-bin.
Итак, создаем указанные директории:
server1:/# mkdir -p /var/www/vs1.example.com/public_html/cgi-bin server1:/# mkdir -p /var/www/vs2.example.com/public_html/cgi-bin
Создаем скрипт php.sh:
server1:/# nano /var/www/vs1.example.com/public_html/cgi-bin/php.sh
со следующим содержимым:
#!/bin/sh PHPRC=/etc/php5/cgi/ export PHPRC export PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_CHILDREN=8 exec /usr/lib/cgi-bin/php
Строка PHPRC указывает на каталог, где размещён файл php.ini (т.е. /etc/php5/cgi транслируется в /etc/php5/cgi/php.ini). PHP_FCGI_MAX_REQUESTS задаёт максимальное число запросов, после обработки которого процесс fcgid будет остановлен и запущен заново. PHP_FCGI_CHILDREN определяет число дочерних процессов PHP, которые будут запущены.
Скрипты php.sh должны быть исполняемыми; кроме того, они (и каталоги, в которых скрипты размещаются) должны принадлежать тем же пользователю и группе, которым принадлежит веб-сайт:
server1:/# chown -R web1:web1 /var/www/vs1.example.com/public_html server1:/# chown -R web2:web2 /var/www/vs2.example.com/public_html server1:/# chmod 555 /var/www/vs1.example.com/public_html/cgi-bin/php.sh server1:/# chmod 555 /var/www/vs2.example.com/public_html/cgi-bin/php.sh
Теперь настроим виртуальные хосты vs1.example.com и vs2.example.com в конфигурации Apache:
Для первого сайта:
server1:/# nano /etc/apache2/sites-available/vs1.example.com
<VirtualHost *:80> ServerName www.vs1.example.com ServerAlias vs1.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/vs1.example.com/public_html/www/ <IfModule mod_fcgid.c> SuexecUserGroup web1 web1 PHP_Fix_Pathinfo_Enable 1 <Directory /var/www/vs1.example.com/public_html/www/> Options +ExecCGI AllowOverride All AddHandler fcgid-script .php FCGIWrapper /var/www/vs1.example.com/public_html/cgi-bin/php.sh .php Order allow,deny Allow from all </Directory> </IfModule> # ErrorLog /var/log/apache2/error.log # CustomLog /var/log/apache2/access.log combined ServerSignature Off </VirtualHost>
Подключаем только что добавленный сайт:
server1:/# a2ensite vs1.example.com
Для второго сайта:
server1:/# nano /etc/apache2/sites-available/vs2.example.com
<VirtualHost *:80> ServerName www.vs2.example.com ServerAlias vs2.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/vs2.example.com/public_html/www/ <IfModule mod_fcgid.c> SuexecUserGroup web2 web2 PHP_Fix_Pathinfo_Enable 1 <Directory /var/www/vs2.example.com/public_html/www/> Options +ExecCGI AllowOverride All AddHandler fcgid-script .php FCGIWrapper /var/www/vs2.example.com/public_html/cgi-bin/php.sh .php Order allow,deny Allow from all </Directory> </IfModule> # ErrorLog /var/log/apache2/error.log # CustomLog /var/log/apache2/access.log combined ServerSignature Off </VirtualHost>
Подключаем:
server1:/# a2ensite vs2.example.com
Теперь надо перегрузить конфиги Apache:
server1:/# /etc/init.d/apache2 reload
3. Тестирование.
Теперь создадим небольшой тестовый PHP-файл, например, для сайта vs1.example.com:
Переходим под пользователя:
server1:/# su web1
и создаем файл в директории /var/www/vs1.example.com/public_html/www/ с названием phpinfo.php:
web1@server1:~$ nano /var/www/vs1.example.com/public_html/www/phpinfo.php
со следующим содержимым:
<?php phpinfo(); ?>
И вызовем этот файл из браузера (http://vs1.example.com/phpinfo.php). Если всё правильно, результат будет похож на приведённый на рисунке, и вы увидите CGI/FastCGI в строке Server API:
Ну вот собссно и все 🙂 Система настроена на работу с suexec.