Как настроить Apache2 с mod_fcgid и PHP5 на Fedora 10
Кратко: установка Apache2 + mod_fcgid и запуск PHP5 через php-cgi позволяет исполнять PHP-скрипты от имени владельца файлов (suExec). В этой инструкции показано, как подготовить систему, создать пользователей и vhost’ы, сделать обёртки (wrapper) для php-cgi и настроить виртуальные хосты для двух сайтов. Важно: SELinux должен быть выключен, suExec ограничивает пути, поэтому для каждого сайта нужен собственный стартовый скрипт.
Version 1.0
Author: Falko Timme
Это руководство описывает, как установить Apache2 с mod_fcgid и PHP5 на Fedora 10. mod_fcgid — совместимая альтернатива модулю mod_fastcgi. Он позволяет исполнять PHP-скрипты с правами их владельцев, а не пользователя Apache.
Я не даю гарантий, что это сработает в вашей среде.
1 Предварительная заметка
В этом руководстве используется сервер Fedora 10 с именем host server1.example.com и IP-адресом 192.168.0.100.
Я создам два виртуальных хоста: www.example1.com и www.example2.com, чтобы продемонстрировать работу mod_fcgid.
Перед началом убедитесь, что SELinux отключён. Откройте /etc/selinux/config:
vi /etc/selinux/config… и установите SELINUX в disabled:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targetedЗатем примените изменение командой:
setenforce 02 Установка Apache2/mod_fcgid/PHP5
Установите Apache2, mod_fcgid и PHP5:
yum install httpd mod_fcgid php-cliЕсли Apache уже установлен с PHP как модулем (libphp5), отключите встроенный модуль PHP — откройте /etc/httpd/conf.d/php.conf:
vi /etc/httpd/conf.d/php.conf… и закомментируйте всё в этом файле (пример ниже показывает содержимое с отключёнными строками):
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
#LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
#AddHandler php5-script .php
#AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
#DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phpsЗатем создайте системные ссылки автозапуска для Apache и запустите сервис:
chkconfig --levels 235 httpd on
/etc/init.d/httpd restartОткройте /etc/php.ini:
vi /etc/php.ini… и добавьте в конец файла строку:
[...]
cgi.fix_pathinfo = 1Затем перезагрузите Apache:
/etc/init.d/httpd reload3 Создание виртуальных хостов для www.example1.com и www.example2.com
В этом примере создаются два хоста: www.example1.com c корнем /var/www/web1/web и www.example2.com с корнем /var/www/web2/web. Владельцами каталогов будут пользователи и группы web1 и web2 соответственно.
Сначала создаём группы и пользователей:
groupadd web1
groupadd web2
useradd -s /bin/false -d /var/www/web1 -m -g web1 web1
useradd -s /bin/false -d /var/www/web2 -m -g web2 web2
chmod 755 /var/www/web1
chmod 755 /var/www/web2Создаём document root и назначаем владельцев:
mkdir -p /var/www/web1/web
chown web1:web1 /var/www/web1/web
mkdir -p /var/www/web2/web
chown web2:web2 /var/www/web2/webМы будем запускать PHP через suExec; document root suExec — /var/www, что видно из вывода:
/usr/sbin/suexec -V[root@server1 ~]# /usr/sbin/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"
[root@server1 ~]#Поэтому нельзя вызывать бинарник PHP (/usr/bin/php-cgi) прямо из мест, находящихся вне /var/www. SuExec не допускает символических ссылок. Решение — создать для каждого сайта wrapper-скрипт внутри /var/www, который будет запускать /usr/bin/php-cgi. Wrapper должен принадлежать соответствующему пользователю и группе.
Создаём каталоги для wrapper-скриптов:
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2Содержимое стартового скрипта для web1:
vi /var/www/php-fcgi-scripts/web1/php-fcgi-starter#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiСодержимое стартового скрипта для web2:
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiПояснения:
- PHPRC указывает каталог с php.ini (в данном случае /etc/ → /etc/php.ini).
- PHP_FCGI_MAX_REQUESTS — максимальное число обработанных запросов процессом fcgid до перезапуска.
- PHP_FCGI_CHILDREN — число дочерних PHP-процессов для каждого экземпляра.
Скрипты должны быть исполняемыми и принадлежать соответствующим пользователям:
chmod 755 /var/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /var/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /var/www/php-fcgi-scripts/web1
chown -R web2:web2 /var/www/php-fcgi-scripts/web2Добавьте два виртуальных хоста в конец /etc/httpd/conf/httpd.conf:
vi /etc/httpd/conf/httpd.conf[...]
NameVirtualHost *:80
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin [email protected]
DocumentRoot /var/www/web1/web/
SuexecUserGroup web1 web1
PHP_Fix_Pathinfo_Enable 1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/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
ServerName www.example2.com
ServerAlias example2.com
ServerAdmin [email protected]
DocumentRoot /var/www/web2/web/
SuexecUserGroup web2 web2
PHP_Fix_Pathinfo_Enable 1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/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.
Перезагрузите конфигурацию Apache:
/etc/init.d/httpd reloadКогда эта схема может не сработать
- SuExec ограничивает корневой каталог; если ваш php-cgi находится вне /var/www и вы не хотите создавать wrapper’ы, подход не сработает.
- Если SELinux активен и в режиме enforcing, доступы могут блокироваться — сначала отключите или настройте политики.
- На современных дистрибутивах Fedora/Ubuntu/PHP версии и пути отличаются. Fedora 10 — устаревшая система.
Альтернативные подходы
- Использовать php-fpm + модуль mod_proxy_fcgi (современный, рекомендуемый вариант). php-fpm работает как отдельный демон и проще масштабируется.
- Запускать PHP как модуль Apache (libphp5) — упрощает конфигурацию, но все процессы будут от имени Apache-пользователя (меньше изоляции).
- Контейнеризация (Docker) для изоляции приложений и управления версиями PHP.
Чек-лист перед запуском (роль-based)
Администратор системы:
- Отключил SELinux или настроил политику.
- Установил пакеты: httpd, mod_fcgid, php-cli.
- Создал пользователей и каталоги с корректными правами.
DevOps / Dev:
- Проверил, что php.ini содержит cgi.fix_pathinfo = 1.
- Протестировал php-cgi запуск вручную.
Безопасность:
- Проверил права на wrapper-скрипты и каталоги.
- Убедился, что не создаются символические ссылки, ведущие вне /var/www.
Мини‑методология настройки (шаги)
- Отключить или настроить SELinux.
- Установить httpd, mod_fcgid, php-cli.
- Отключить libphp5, если он загружен.
- Создать пользователей и документ‑руты.
- Создать wrapper-скрипты в /var/www и сделать их собственностью сайтов.
- Добавить виртуальные хосты с FCGIWrapper и SuexecUserGroup.
- Перезагрузить Apache и проверить логи.
Мини‑шпаргалка конфигурации
- suExec корень: проверьте /usr/sbin/suexec -V
- PHPRC=/etc/ → указывает на /etc/php.ini
- Рекомендуемые права: каталоги 755, wrapper 755, владелец — сайт-пользователь
- Перезапуск Apache: /etc/init.d/httpd reload
Тесты и критерии приёмки
- На каждой виртуальной машине разместите index.php со строкой phpinfo(); откройте в браузере — должно отображаться PHP-инфо, и в поле “User” должен быть пользователь сайта (web1/web2).
- Проверьте логи ошибок Apache (/var/log/httpd/error_log) и лог suexec (/var/log/httpd/suexec.log) на предмет ошибок прав и запуска.
Короткий глоссарий
- mod_fcgid — модуль Apache для запуска FastCGI-приложений.
- suExec — механизм Apache для запуска CGI-программ от имени другого пользователя.
- php-cgi — CGI-версия PHP-интерпретатора.
- wrapper — shell-скрипт, запускающий php-cgi и находящийся в разрешённом пути suExec.
Замечания по безопасности и миграции
- Fedora 10 устарела. Для новых установок рассмотрите современные дистрибутивы и PHP-пакеты.
- Для лучшей производительности и безопасности используйте php-fpm и mod_proxy_fcgi на современных системах.
- Ограничьте доступ к /var/www/php-fcgi-scripts и следите за правами файлов.
Краткое руководство по откату в случае проблем
- Вернуть изменения в /etc/httpd/conf/httpd.conf (удалить добавленные vhost’ы).
- Восстановить /etc/httpd/conf.d/php.conf (если вы устанавливали libphp5).
- Удалить или изменить wrapper-скрипты и проверить владельцев каталогов.
- Включить SELinux (если отключали) и откорректировать политики.
Резюме
- mod_fcgid + suExec позволяют запускать PHP скрипты с правами владельца файлов.
- Необходимо создать отдельный wrapper-скрипт в пределах суэкзек‑корня (/var/www) для каждого сайта.
- Следуйте чек-листу и тестам, проверяйте логи при проблемах.
Важно: адаптируйте примеры под вашу систему — пути, версии PHP и политика безопасности могут отличаться.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента