Как настроить Apache2 с mod_fcgid и PHP5 на Fedora 13
Version 1.0
Author: Falko Timme
Следите за мной в Twitter
Это руководство описывает, как установить Apache2 с mod_fcgid и PHP5 на Fedora 13. mod_fcgid — совместимая альтернатива устаревшему mod_fastcgi. Он позволяет выполнять PHP-скрипты с правами их владельцев, а не от имени пользователя Apache.
Я не даю никаких гарантий, что это сработает в вашей среде!
1 Предварительная заметка
В этом руководстве я использую сервер Fedora 13 с именем host server1.example.com и IP-адресом 192.168.0.100.
Я создам два Apache-виртуальных хоста в примере: 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 0чтобы изменение вступило в силу.
2 Установка Apache2, mod_fcgid и PHP5
Установим Apache2, mod_fcgid и PHP5 следующей командой:
yum install httpd mod_fcgid php-cliЕсли Apache был уже установлен с PHP5 как модуль Apache, отключите модуль PHP5 — откройте /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. # # |
Затем создайте системные ссылки автозапуска для Apache и запустите сервис:
chkconfig --levels 235 httpd on
/etc/init.d/httpd restartДалее откройте /etc/php.ini:
vi /etc/php.iniи раскомментируйте строку cgi.fix_pathinfo = 1:
| [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=1 [...] |
Откройте /etc/httpd/conf.d/fcgid.conf:
vi /etc/httpd/conf.d/fcgid.confи добавьте строку PHP_Fix_Pathinfo_Enable 1 (в отличие от предыдущих версий Fedora, в 13-й версии эта директива не должна находиться внутри
| # This is the Apache server configuration file for providing FastCGI support # through mod_fcgid # # Documentation is available at # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html LoadModule fcgid_module modules/mod_fcgid.so # Use FastCGI to process .fcg .fcgi & .fpl scripts AddHandler fcgid-script fcg fcgi fpl # Sane place to put sockets and shared memory file FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm PHP_Fix_Pathinfo_Enable 1 |
Затем перезагрузите Apache:
/etc/init.d/httpd reload3 Создание виртуальных хостов для www.example1.com и www.example2.com
Я создам два виртуальных хоста: www.example1.com (DocumentRoot /var/www/web1/web) и www.example2.com (DocumentRoot /var/www/web2/web). Хост www.example1.com будет принадлежать пользователю/группе web1, а www.example2.com — 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Затем создаём корни документов и назначаем владельцев:
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; корневой каталог 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) напрямую из-за того, что он находится за пределами корня suExec. suExec также не допускает символических ссылок. Единственный способ — создать обёртку (wrapper script) для каждого сайта в подпапке /var/www; эта обёртка вызовет /usr/bin/php-cgi. Скрипт-обёртка должен принадлежать пользователю и группе сайта, поэтому нужен отдельный скрипт для каждого сайта. Я помещаю обёртки в /var/www/php-fcgi-scripts/web1 и /var/www/php-fcgi-scripts/web2.
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2vi /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 |
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.
Скрипты php-fcgi-starter должны быть исполняемыми, и они (а также директории, в которых находятся) должны принадлежать пользователю и группе сайта:
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Теперь создадим Apache-виртуальные хосты для www.example1.com и www.example2.com. Добавьте следующие два vhost в конец /etc/httpd/conf/httpd.conf:
vi /etc/httpd/conf/httpd.conf| [...] NameVirtualHost *:80 |
Убедитесь, что вы указали правильные пути и корректного пользователя/группу в директиве SuexecUserGroup.
Перезагрузите Apache:
/etc/init.d/httpd reloadКогда это может не сработать
- SELinux включён — suExec и mod_fcgid могут блокироваться.
- Неправильные права или владелец обёрток — suExec отклонит запуск.
- Если php-cgi находится в нестандартном пути, скорректируйте exec-путь в обёртке.
- Если на сервере уже используется PHP как модуль (libphp5.so) — убедитесь, что вы отключили модуль, чтобы не было конфликтов обработчиков .php.
Альтернативные подходы
- Использовать PHP-FPM (php-fpm) с mod_proxy_fcgi — современная и производительная альтернатива mod_fcgid.
- Оставить PHP как модуль Apache (меньше процессов, но все скрипты выполняются от пользователя apache).
- Использовать nginx + php-fpm для разделения фронта и обработки PHP.
Контрольный список по ролям
- Администратор сервера: проверить SELinux, установить пакеты, настроить автозапуск httpd.
- Разработчик/владелец сайта: создать директории, загрузить код в /var/www/webX/web, проверить права.
- DevOps/инженер безопасности: убедиться в ограничениях FCGIWrapper, логировании и ротации логов.
Критерии приёмки
- Apache слушает порт 80 и отвечает на запросы к обоим виртуальным хостам.
- PHP-скрипт выполняется под пользователем web1 для первого хоста и web2 для второго.
- В логах /var/log/httpd и /var/log/httpd/suexec.log нет ошибок запуска obёрток.
- Нет конфликтов обработчиков .php (только mod_fcgid для .php).
Минимальная методология развертывания (быстро)
- Отключить SELinux и проверить setenforce.
- Установить httpd, mod_fcgid, php-cli.
- Отключить модуль libphp5, если он загружен.
- Настроить php.ini (cgi.fix_pathinfo=1).
- Создать директории, пользователей и обёртки php-fcgi.
- Добавить vhost-конфигурации и перезагрузить Apache.
- Проверить выполнение PHP-скрипта и логи.
Рекомендации по безопасности
- Держите права файлов минимальными (755 для директорий, 644 для файлов, исполняемые только там, где нужно).
- Отключайте показ ошибок для продакшн-сайтов (display_errors=Off в php.ini).
- Ограничьте доступ к директориям через AllowOverride и Options.
- Настройте регулярную ротацию логов и мониторинг suexec.log.
Короткая сводка
- mod_fcgid позволяет запускать PHP под правами владельца скрипта через suExec.
- Требуется обёртка-скрипт в пределах AP_DOC_ROOT (/var/www), вызывающая /usr/bin/php-cgi.
- Важно корректно настроить права, владельцев и параметры php-fcgi-starter.
Важно: адаптируйте пути и параметры PHP_FCGI_CHILDREN / PHP_FCGI_MAX_REQUESTS под нагрузку вашего сервера.
Сводка ключевых шагов: установка пакетов → отключение модуля PHP → настройка php.ini и fcgid.conf → создание пользователей/директорий → обёртки для php-cgi → конфигурация vhost → перезагрузка Apache.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента