Гид по технологиям

Как настроить Apache2 с mod_fcgid и PHP5 на CentOS 5.2

• 4 min read • Серверы • Обновлено 21 Nov 2025
Apache2 + mod_fcgid и PHP5 на CentOS 5.2
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 reload

3 Создание 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, управляет процессами приложений.

Примеры проверки и тесты

  1. Создать /var/www/web1/web/info.php с содержимым и открыть http://www.example1.com/info.php — убедиться, что информация отображается.
  2. Запустить whoami() в скрипте и проверить, что результат web1 для первого сайта и web2 для второго.
  3. Поменять права файла на 600 и убедиться, что suExec не мешает исполнению, если файл принадлежит правильному пользователю.

Краткое резюме

  • Установите mod_fcgid из тестового репозитория, отключите PHP как модуль Apache.
  • Настройте obёртки в пределах /var/www, чтобы suExec мог их запускать.
  • Настройте vhost с FCGIWrapper и SuexecUserGroup.
  • Проведите тесты и проверьте логи.

Важно: это руководство ориентировано на CentOS 5.2 и историческую архитектуру. Для современных дистрибутивов и больших нагрузок рекомендуется php-fpm.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро