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

Как установить Apache2 с mod_fcgid и PHP5 на CentOS 5.6

• 5 min read • Linux • Обновлено 24 Nov 2025
Установка Apache2 с mod_fcgid и PHP5 на CentOS 5.6
Установка 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. # # # LoadModule php5_module modules/libphp5.so # # # # Use of the "ZTS" build with worker is experimental, and no shared # # modules are supported. # LoadModule php5_module modules/libphp5-zts.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 и добавьте строку cgi.fix_pathinfo = 1 в конце файла:

vi /etc/php.ini

| [...] cgi.fix_pathinfo = 1 |

Затем перезагрузите (reload) Apache:

/etc/init.d/httpd reload

3 Создание виртуальных хостов для 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 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

Быстрая методология (микро-план)

  1. Подключите тестовый репозиторий и установите пакеты.
  2. Отключите встроенный модуль PHP в Apache (если был подключён).
  3. Включите cgi.fix_pathinfo в php.ini.
  4. Создайте пользователей и директорий для сайтов.
  5. Сделайте поддиректории с php-fcgi-обёртками в /var/www.
  6. Настройте VirtualHost с FCGIWrapper и SuexecUserGroup.
  7. Перезагрузите 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.

Тестирование и приёмочный прогон

  1. Создайте простой /var/www/web1/web/index.php с содержимым:
  1. Откройте http://www.example1.com в браузере и убедитесь, что выводится phpinfo().
  2. Проверьте, что в выводе phpinfo() пользователь и группа совпадают с web1.
  3. Просмотрите логи Apache и /var/log/httpd/suexec.log на предмет ошибок.

Итог

Вы настроили Apache2 с mod_fcgid и PHP5 на CentOS 5.6, создали обёртки для PHP-CGI, настроили виртуальные хосты и проверили запуск PHP под учётными записями владельцев сайта. Для production-сред рассмотрите переход на PHP-FPM и настройку SELinux для безопасной эксплуатации.

Важно: всегда тестируйте изменения в тестовой среде перед применением в production.

Поделиться: 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 быстро