Как настроить Apache2 с mod_fcgid и PHP5 на Fedora 14
Версия 1.0
Автор: Falko Timme
Следите за мной в Twitter
Предварительная заметка
В этом руководстве показано, как установить Apache2 с mod_fcgid и PHP5 на сервере Fedora 14. mod_fcgid — совместимая альтернатива устаревшему mod_fastcgi. Он позволяет выполнять PHP-скрипты с правами их владельцев, а не пользователя Apache.
Я не даю гарантии, что инструкция сработает в вашей среде — проверяйте конфигурацию и делайте бэкапы.
Я использую сервер Fedora 14 с именем server1.example.com и IP 192.168.0.100.
Создам два виртуальных хоста: www.example1.com и www.example2.com, чтобы продемонстрировать работу mod_fcgid.
Важно: перед началом убедитесь, что SELinux отключён или настроен так, чтобы не блокировать выполнение PHP через mod_fcgid.
Откройте /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Установка 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. # # |
Создайте системные ссылки для автозапуска Apache и запустите сервис:
chkconfig --levels 235 httpd on
/etc/init.d/httpd restartОткройте /etc/php.ini:
vi /etc/php.iniи раскомментируйте строку cgi.fix_pathinfo = 1 (это важно для корректного определения PATH_INFO в CGI):
| [...] ; 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 (она не должна находиться внутри блока
| # 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 reloadСоздание виртуальных хостов для www.example1.com и www.example2.com
В этом примере я создам два vhost: www.example1.com с DocumentRoot /var/www/web1/web (владелец web1) и www.example2.com с DocumentRoot /var/www/web2/web (владелец 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 ~]#Так как /usr/bin/php-cgi находится вне AP_DOC_ROOT, нельзя вызывать php-cgi напрямую из vhost через suExec. suExec также не разрешает символические ссылки. Решение — создать для каждого сайта обёртку-скрипт внутри /var/www, которая будет запускать /usr/bin/php-cgi. Скрипт должен принадлежать соответствующему пользователю сайта.
Создайте каталоги обёрток:
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2Создайте /var/www/php-fcgi-scripts/web1/php-fcgi-starter:
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 |
Создайте /var/www/php-fcgi-scripts/web2/php-fcgi-starter:
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/php.ini). PHP_FCGI_MAX_REQUESTS — максимум запросов до перезапуска процесса. 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 |
Убедитесь, что пути и значения SuexecUserGroup соответствуют вашей системе.
Перезагрузите Apache:
/etc/init.d/httpd reloadПроверка и отладка
- Создайте в каждом DocumentRoot файл info.php с содержимым:
Откройте в браузере http://www.example1.com/info.php и http://www.example2.com/info.php. Важно убедиться, что phpinfo показывает использование CGI/FastCGI и что владелец процесса соответствует владельцу сайта.
Если страница не открывается: проверьте /var/log/httpd/error_log, /var/log/httpd/access_log и /var/log/httpd/suexec.log.
Важно: ошибки прав доступа и неправильный AP_DOC_ROOT в конфигурации suExec — самые частые причины отказа.
Альтернативные подходы
- Использовать PHP-FPM вместе с модулем mod_proxy_fcgi (предпочтительный подход в современных системах). PHP-FPM даёт более гибкое управление процессами и лучше масштабируется.
- Оставить PHP как модуль Apache (mod_php) — проще в настройке, но все скрипты выполняются от пользователя Apache, что хуже с точки зрения изоляции.
- Использовать контейнеризацию (Docker) и запускать каждый сайт в отдельном контейнере с собственным PHP-FPM.
Когда эта схема не сработает
- SELinux включён и не настроен для разрешения модулю mod_fcgid или suExec.
- suExec AP_DOC_ROOT не включает путь к исполняемой обёртке.
- Файлы и каталоги имеют неправильные права/владельца.
- Установлен модуль PHP как встроенный в Apache (libphp) и он конфликтует с mod_fcgid.
Контрольный список ролей
- Администратор: установить пакеты, настроить SELinux, проверить suexec -V, настроить автозапуск httpd.
- DevOps/Инженер по деплою: создать пользователей сайтов, скрипты-обёртки, настроить FCGIWrapper и перезагрузить сервисы.
- Веб-разработчик: разместить info.php и тестовые скрипты, проверить phpinfo и права доступа.
Мини-методология внедрения
- Подготовка окружения: бэкап конфигов, отключение SELinux (или настройка).
- Установка пакетов и отключение mod_php при необходимости.
- Подготовка пользователей и директорий.
- Создание обёрток и назначение прав.
- Настройка vhost и тестирование.
- Мониторинг логов и корректировка параметров PHP_FCGI_CHILDREN/PHP_FCGI_MAX_REQUESTS.
Критерии приёмки
- phpinfo отображается для каждого сайта и показывает запуск через CGI/FastCGI.
- Процессы PHP запущены с UID соответствующего пользователя сайта.
- Логи не содержат ошибок суExec или mod_fcgid при обработке запросов.
- Доступность сайта подтверждена из браузера и/или curl.
Небольшой глоссарий
- mod_fcgid — модуль Apache для поддержки FastCGI.
- suExec — механизм Apache для запуска CGI-скриптов от имени конкретного пользователя.
- FCGIWrapper — директива, указывающая обёртку для обработки .php через FastCGI.
Советы по безопасности
- Не давайте обёрткам права записи посторонним пользователям.
- Ограничьте права на каталоги до минимально необходимых (755 для директорий, 644 для файлов).
- Следите за логами /var/log/httpd/suexec.log.
- Рассмотрите перевод на PHP-FPM и изоляцию сайтов контейнерами для лучшей безопасности.
Заключение
Эта инструкция показывает, как запустить Apache2 с mod_fcgid и PHP5 на Fedora 14, чтобы PHP-скрипты выполнялись с правами владельца сайта. Варианты улучшения включают PHP-FPM, контейнеризацию и более строгую настройку SELinux. Проводите тестирование после каждого шага и контролируйте логи.
Ключевые команды и конфиги приведены выше — используйте их как шаблоны и адаптируйте под вашу инфраструктуру.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента