Как установить Apache2 с mod_fcgid и PHP5 на CentOS 5.6
Version 1.0
Автор: Falko Timme
Следите за мной в Twitter
Этот туториал описывает, как установить Apache2 с mod_fcgid и PHP5 на CentOS 5.6. mod_fcgid — совместимая альтернатива старому mod_fastcgi. Он позволяет выполнять PHP-скрипты от имени их владельцев, а не от пользователя Apache.
Я не даю гарантий, что это сработает в вашей среде!
1 Предварительная заметка
В этом примере используется сервер CentOS 5.6 с именем host server1.example.com и IP 192.168.0.100.
Я создам два виртуальных хоста в примере: www.example1.com и www.example2.com, чтобы продемонстрировать использование mod_fcgid.
Важно: перед началом убедитесь, что SELinux отключён. Выполните:
system-config-securitylevelчтобы отключить SELinux, и затем:
setenforce 0для вступления изменения в силу.
Важно: Отключение SELinux облегчает настройку, но снижает уровень защиты. На production-серверах лучше настроить SELinux корректно или использовать политики, которые не мешают работе mod_fcgid.
2 Установка Apache2, mod_fcgid и PHP5
mod_fcgid отсутствует в официальных репозиториях CentOS, но доступен в тестовом репозитории centos.karan.org для CentOS 5.x. Подключите репозиторий так:
cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repoЗатем откройте /etc/yum.repos.d/kbsingh-CentOS-Extras.repo:
vi /etc/yum.repos.d/kbsingh-CentOS-Extras.repoи в секции [kbs-CentOS-Testing] установите gpgcheck в 0 и enabled в 1:
| [...] [kbs-CentOS-Testing] name=CentOS.Karan.Org-EL$releasever - Testing gpgcheck=0 gpgkey=http://centos.karan.org/RPM-GPG-KEY-karan.org.txt enabled=1 baseurl=http://centos.karan.org/el$releasever/extras/testing/$basearch/RPMS/ |
После этого установите 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 и добавьте строку cgi.fix_pathinfo = 1 в конце файла:
vi /etc/php.ini| [...] cgi.fix_pathinfo = 1 |
Затем перезагрузите (reload) Apache:
/etc/init.d/httpd reload3 Создание виртуальных хостов для www.example1.com и www.example2.com
В этом примере создаются два vhost’а: www.example1.com с DocumentRoot /var/www/web1/web и www.example2.com с DocumentRoot /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Затем создайте корневые каталоги документов и установите владельцев:
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. Обёртка должна принадлежать соответствующему пользователю и группе сайта.
Создадим обёртки в /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/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/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 |
Убедитесь, что пути и пользователи в директивах SuexecUserGroup указаны корректно для ваших сайтов.
Перезагрузите конфигурацию Apache:
/etc/init.d/httpd reloadБыстрая методология (микро-план)
- Подключите тестовый репозиторий и установите пакеты.
- Отключите встроенный модуль PHP в Apache (если был подключён).
- Включите cgi.fix_pathinfo в php.ini.
- Создайте пользователей и директорий для сайтов.
- Сделайте поддиректории с php-fcgi-обёртками в /var/www.
- Настройте VirtualHost с FCGIWrapper и SuexecUserGroup.
- Перезагрузите Apache и протестируйте.
Чек-лист по ролям
- Системный администратор:
- Проверил отключение SELinux или настроил политики.
- Установил репозиторий и пакеты.
- Настроил права и владельцев каталогов.
- Владелец сайта / разработчик:
- Проверил, что php.ini содержит cgi.fix_pathinfo=1.
- Разместил тестовый index.php в DocumentRoot и выполнил тесты.
- Тестировщик:
- Проверил, что PHP-скрипты выполняются под учетной записью владельца сайта.
- Проверил логи /var/log/httpd/ и /var/log/httpd/suexec.log на ошибки.
Критерии приёмки
- PHP-скрипты выполняются корректно и возвращают ожидаемый HTML/ответ.
- uid/gid процесса PHP соответствует владельцу сайта (web1/web2).
- Нет ошибок в логах Apache и suexec.log при старте и обработке запросов.
- Перезапуск/перезагрузка Apache не вызывает потери работоспособности сайтов.
Альтернативы и когда это не подходит
- Используйте php-fpm (PHP-FPM) и модуль mod_proxy_fcgi, если вам важна лучшая производительность и управление пулами PHP-процессов.
- Если вы не можете отключить SELinux или не хотите менять политики, настройка через mod_fcgid + suExec может быть сложнее; рассмотрите контейнеризацию (Docker) или chroot/namespace-решения.
- Для современных дистрибутивов CentOS/Red Hat лучше использовать пакеты, поддерживаемые репозиторием EPEL или официальными репозиториями, а не тестовые.
Когда это может сломаться (примеры)
- Неправильные права на скрипты или каталоги (suExec отказ).
- Ошибки в путях FCGIWrapper или отсутствие исполняемых флагов у обёртки.
- Конфликт с загруженным модулем mod_php (если не отключён).
- Ограничения ресурсов (слишком мало PHP_FCGI_CHILDREN или высокие значения без ресурсов).
1‑строчный глоссарий
- mod_fcgid: модуль Apache для запуска приложений через FastCGI.
- suExec: механизм запуска CGI-приложений от имени владельца файла.
- FCGIWrapper: путь к исполняемой обёртке FastCGI для конкретного vhost.
- php-cgi: CGI-версия PHP для использования с FastCGI.
Рекомендации по безопасности
- Не запускайте PHP-обёртки с правами root.
- Минимизируйте права на каталоги (только необходимые).
- Ограничьте доступ к конфигам (например, /etc/php.ini).
- Рассмотрите использование SELinux с корректными политиками для production.
Тестирование и приёмочный прогон
- Создайте простой /var/www/web1/web/index.php с содержимым:
- Откройте http://www.example1.com в браузере и убедитесь, что выводится phpinfo().
- Проверьте, что в выводе phpinfo() пользователь и группа совпадают с web1.
- Просмотрите логи Apache и /var/log/httpd/suexec.log на предмет ошибок.
Итог
Вы настроили Apache2 с mod_fcgid и PHP5 на CentOS 5.6, создали обёртки для PHP-CGI, настроили виртуальные хосты и проверили запуск PHP под учётными записями владельцев сайта. Для production-сред рассмотрите переход на PHP-FPM и настройку SELinux для безопасной эксплуатации.
Важно: всегда тестируйте изменения в тестовой среде перед применением в production.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента