Установка Apache2 с mod_fcgid и PHP5 на OpenSUSE 11.2
Предварительная заметка
В примере используется сервер OpenSUSE 11.2 с именем host server1.example.com и IP 192.168.0.100.
Мы создаём два виртуальных хоста: www.example1.com и www.example2.com, чтобы продемонстрировать работу mod_fcgid с разными пользователями веб-сайтов.
Важное: все команды выполняются от пользователя с правами root или через sudo.
Установка Apache2, mod_fcgid и PHP5
Установите необходимые пакеты:
yast2 -i apache2 apache2-mod_fcgid php5-fastcgiЕсли PHP ранее был подключён как модуль Apache, отключите модуль php5:
a2dismod php5Включите модули suexec и fcgid:
a2enmod suexec
a2enmod fcgidСоздайте системные ссылки запуска Apache и запустите сервис:
chkconfig --add apache2
/etc/init.d/apache2 startОткройте конфигурационный php.ini для FastCGI и убедитесь, что включено исправление PATH_INFO:
vi /etc/php5/fastcgi/php.iniНайдите и раскомментируйте строку:
cgi.fix_pathinfo=1(В исходнике php.ini это выглядит как часть блока с объяснением; цель — чтобы PHP CGI соответствовал спецификации PATH_INFO.)
Перезапустите Apache:
/etc/init.d/apache2 restartСоздание пользователей, директорий и обёрток для PHP
В этом сценарии каждый сайт работает под своим системным пользователем: web1 и web2. Создайте группы и пользователей, настройте права:
groupadd web1
groupadd web2
useradd -s /bin/false -d /srv/www/web1 -m -g web1 web1
useradd -s /bin/false -d /srv/www/web2 -m -g web2 web2
chmod 755 /srv/www/web1
chmod 755 /srv/www/web2Создайте корни сайтов и установите права собственности:
mkdir -p /srv/www/web1/web
chown web1:web1 /srv/www/web1/web
mkdir -p /srv/www/web2/web
chown web2:web2 /srv/www/web2/webПроверьте настройки suExec — корень для suExec должен быть /srv/www. Вывод утилиты показывает это:
/usr/sbin/suexec2 -VПример вывода:
server1:~ # /usr/sbin/suexec2 -V
-D AP_DOC_ROOT="/srv/www"
-D AP_GID_MIN=96
-D AP_HTTPD_USER="wwwrun"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=96
-D AP_USERDIR_SUFFIX="public_html"
server1:~ #Поскольку /usr/bin/php-cgi находится вне AP_DOC_ROOT, suExec не позволит запускать его напрямую. Решение — создать скрипт-обёртку внутри дерева /srv/www, который будет запускать /usr/bin/php-cgi. Для каждого сайта — своя обёртка, принадлежащая соответствующему пользователю.
Создайте каталоги для обёрток:
mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2Создайте содержимое файлов-обёрток (пример для web1 и web2). Файл /srv/www/php-fcgi-scripts/web1/php-fcgi-starter:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiИ аналогично для web2 в /srv/www/php-fcgi-scripts/web2/php-fcgi-starter:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiОбъяснение переменных:
- PHPRC — путь к каталогу с php.ini для FastCGI (/etc/php5/fastcgi/php.ini).
- PHP_FCGI_MAX_REQUESTS — сколько запросов обработает один процесс перед перезапуском.
- PHP_FCGI_CHILDREN — число дочерних PHP-процессов для каждого запущенного процесса.
Сделайте скрипты исполняемыми и установите владельцев:
chmod 755 /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /srv/www/php-fcgi-scripts/web1
chown -R web2:web2 /srv/www/php-fcgi-scripts/web2Конфигурация виртуальных хостов
Создайте файл виртуального хоста для www.example1.com, например /etc/apache2/vhosts.d/www.example1.com.conf, со следующим содержимым:
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin [email protected]
DocumentRoot /srv/www/web1/web/
SuexecUserGroup web1 web1
PHP_Fix_Pathinfo_Enable 1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /srv/www/php-fcgi-scripts/web1/php-fcgi-starter .php
Order allow,deny
Allow from all
# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off
Аналогичная конфигурация для www.example2.com в /etc/apache2/vhosts.d/www.example2.com.conf:
ServerName www.example2.com
ServerAlias example2.com
ServerAdmin [email protected]
DocumentRoot /srv/www/web2/web/
SuexecUserGroup web2 web2
PHP_Fix_Pathinfo_Enable 1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /srv/www/php-fcgi-scripts/web2/php-fcgi-starter .php
Order allow,deny
Allow from all
# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off
Убедитесь, что пути и значения SuexecUserGroup соответствуют созданным пользователям и каталогам.
Откройте /etc/apache2/httpd.conf и добавьте строку NameVirtualHost перед Include /etc/apache2/vhosts.d/.conf, если её там нет:
vi /etc/apache2/httpd.confДобавьте/проверьте:
NameVirtualHost *
Include /etc/apache2/vhosts.d/*.confПеред перезапуском Apache измените права suExec-исполняемого файла, чтобы избежать предупреждения “SuexecUserGroup directive requires SUEXEC wrapper.”:
chmod 4755 /usr/sbin/suexec2Перезапустите Apache:
/etc/init.d/apache2 restartМини-методология (быстрая последовательность действий)
- Установить apache2, модуль fcgid и php5-fastcgi.
- Отключить php5 как модуль Apache, включить suexec и fcgid.
- Создать системных пользователей и каталоги для сайтов.
- Создать скрипты-обёртки в дереве /srv/www и дать им владельца сайта.
- Настроить виртуальные хосты с FCGIWrapper и SuexecUserGroup.
- Провести тесты и перезапустить Apache.
Чеклист для ролей
Администратор:
- Установлены пакеты: apache2, apache2-mod_fcgid, php5-fastcgi.
- a2dismod php5 выполнен (если применимо).
- a2enmod suexec и a2enmod fcgid выполнены.
- Скрипты-обёртки созданы в /srv/www и принадлежат нужным пользователям.
- Права на /usr/sbin/suexec2 выставлены 4755.
- В httpd.conf добавлен NameVirtualHost * и выполнен перезапуск.
Разработчик / владелец сайта:
- Контент сайта размещён в /srv/www/
/web. - Файлы и каталоги принадлежат соответствующему пользователю (web1 или web2).
- PHP-скрипты корректно обрабатываются (проверка phpinfo()).
Шпаргалка команд (сводка)
- Установка: yast2 -i apache2 apache2-mod_fcgid php5-fastcgi
- Отключить модуль: a2dismod php5
- Включить модули: a2enmod suexec; a2enmod fcgid
- Права suExec: chmod 4755 /usr/sbin/suexec2
- Перезапуск Apache: /etc/init.d/apache2 restart
Типичные проблемы и как их решать
Ошибка: “SuexecUserGroup directive requires SUEXEC wrapper.” — Решение: выставьте suExec-бит: chmod 4755 /usr/sbin/suexec2.
PHP не запускается или возвращает 500 — Проверьте: права на скрипт-обёртку, владельца, наличие флага ExecCGI в директиве Directory, а также логи /var/log/apache2/error.log и /var/log/apache2/suexec.log.
Скрипты не видят правильный PATH_INFO — Убедитесь, что в /etc/php5/fastcgi/php.ini установлено cgi.fix_pathinfo=1 и в конфигурации хоста включён PHP_Fix_Pathinfo_Enable 1.
Если FCGIWrapper указывает на файл вне /srv/www — suExec не позволит запуск. Поместите обёртку внутри AP_DOC_ROOT (/srv/www).
Безопасность и рекомендации по правам
- Никогда не делайте скрипты-обёртки исполняемыми глобально; их владельцем должен быть только соответствующий пользователь сайта.
- Ограничьте AllowOverride только там, где действительно нужно; чрезмерное использование .htaccess может привести к уязвимостям.
- Логи suexec полезны для отладки прав — /var/log/apache2/suexec.log.
Критерии приёмки
- Два сайта (www.example1.com и www.example2.com) отвечают и отдают свои страницы.
- PHP-скрипт phpinfo() показывает корректную конфигурацию FastCGI и путь к php.ini /etc/php5/fastcgi/php.ini.
- Процессы PHP выполняются под владельцами web1 и web2, а не под пользователем Apache.
- Нет предупреждений suexec при перезапуске Apache.
Глоссарий (одна строка)
- suExec — механизм Apache для безопасного запуска CGI-программ от имени конкретного пользователя; обеспечивает изоляцию процессов.
Короткое резюме
Вы настроили Apache2 с mod_fcgid и PHP5 на OpenSUSE 11.2 так, чтобы PHP скрипты выполнялись под учётными записями владельцев сайтов. Это повышает безопасность и разделение прав между сайтами. Следуйте чеклистам и проверяйте логи при отладке.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента