Настраиваем Apache2 с mod_fcgid и PHP5 в Debian Lenny

В этом руководстве, я опишу как устанавливать 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.comweb2.

Создаем группы пользователей:

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.

Add Comment

Required fields are marked *. Your email address will not be published.