Как настроить Apache2 с mod_fcgid и PHP5 на CentOS 5.2
Версия 1.0
Автор: Falko Timme
1 Предварительная заметка
В этом руководстве показано, как установить Apache2 с модулем mod_fcgid и PHP5 на сервере CentOS 5.2. mod_fcgid — совместимая альтернатива старому mod_fastcgi. Он позволяет запускать PHP-скрипты под правами их владельцев вместо пользователя Apache.
Я не даю никаких гарантий, что это обязательно сработает в вашей среде!
Я использую сервер CentOS 5.2 с именем хоста server1.example.com и IP 192.168.0.100.
Я создам два Apache vhost: www.example1.com и www.example2.com, чтобы продемонстрировать использование mod_fcgid.
Важно: убедитесь, что SELinux отключён. Запустите:
system-config-securitylevelчтобы отключить SELinux, а затем выполните:
setenforce 0для немедленного эффекта.
2 Установка Apache2 / mod_fcgid / PHP5
mod_fcgid недоступен в официальных репозиториях CentOS, но есть пакет для CentOS 5.x в тестовом репозитории centos.karan.org. Включите репозиторий так:
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 как модулем, отключите модуль 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.
#
#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 Создание vhost для www.example1.com и www.example2.com
В этом примере www.example1.com будет иметь корневой каталог /var/www/web1/web и принадлежать пользователю/группе 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 ~]#suExec не позволяет запускать бинарники за пределами AP_DOC_ROOT напрямую и не допускает символических ссылок. Решение — создать «обёртки» (wrapper scripts) для каждого сайта в поддиректории /var/www. Они будут вызывать /usr/bin/php-cgi. Скрипты должны принадлежать соответствующим пользователям/группам сайтов.
Создаём каталоги для обёрток:
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Теперь добавьте vhost для каждого сайта в конец /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Когда этот подход не подходит
- Если вы используете современную систему (CentOS 7/8/Stream или Ubuntu 18.04+), лучше использовать php-fpm и модуль mod_proxy_fcgi.
- Если нужно масштабирование на уровне процессов и контейнеров, рассмотрите переход на php-fpm с systemd/unit-файлами.
- Если suExec требует выполнения вне /var/www, придётся изменить структуру каталогов или настроить другой механизм запуска.
Альтернативные подходы
- PHP-FPM + mod_proxy_fcgi: современный и производительный путь, поддерживает socket и TCP, проще в управлении в контейнерах.
- FastCGI (старые реализации) — устарело, не рекомендуется.
- Запуск через CGI (exec) — прост, но медленнее и менее масштабируем.
Контрольный список по ролям
- Администратор системы:
- Включил репозиторий и установил пакеты.
- Настроил SELinux/Firewall/права владельцев.
- Владелец сайта:
- Разместил index.php в /var/www/webX/web.
- Проверил права и отсутствие доступов для чужих пользователей.
- Разработчик:
- Убедился, что php.ini и переменные окружения подходят для приложения.
Критерии приёмки
- Apache запускается без ошибок.
- Для каждого виртуального хоста PHP-страница выполняется от имени соответствующего пользователя (проверяется через whoami() или get_current_user()).
- Логи ошибок пусты от критичных записей при первичной загрузке.
- suExec не генерирует сообщений о запрете выполнения из-за расположения бинарника.
Рекомендации по безопасности
- Не давайте права на исполнение скриптов неавторизованным пользователям.
- Проверьте /var/log/httpd/error_log и /var/log/httpd/suexec.log на предмет предупреждений.
- Отключайте ненужные PHP-функции в php.ini для повышения безопасности.
- Рассмотрите chroot или контейнеризацию для изоляции сайтов.
Фактбокс
- suExec ограничивает выполнение в AP_DOC_ROOT (обычно /var/www).
- PHP_FCGI_CHILDREN управляет числом дочерних процессов PHP на одну обёртку.
- PHP_FCGI_MAX_REQUESTS позволяет избежать утечек памяти в долгоживущих процессах.
Однострочный глоссарий
- suExec — механизм Apache, запускающий CGI/скрипты от имени пользователя владельца файла.
- mod_fcgid — реализация FastCGI для Apache, управляет процессами приложений.
Примеры проверки и тесты
- Создать /var/www/web1/web/info.php с содержимым и открыть http://www.example1.com/info.php — убедиться, что информация отображается.
- Запустить whoami() в скрипте и проверить, что результат web1 для первого сайта и web2 для второго.
- Поменять права файла на 600 и убедиться, что suExec не мешает исполнению, если файл принадлежит правильному пользователю.
Краткое резюме
- Установите mod_fcgid из тестового репозитория, отключите PHP как модуль Apache.
- Настройте obёртки в пределах /var/www, чтобы suExec мог их запускать.
- Настройте vhost с FCGIWrapper и SuexecUserGroup.
- Проведите тесты и проверьте логи.
Важно: это руководство ориентировано на CentOS 5.2 и историческую архитектуру. Для современных дистрибутивов и больших нагрузок рекомендуется php-fpm.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента