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

Как настроить Apache2 с mod_fcgid и PHP5 на Fedora 10

• 5 min read • Linux • Обновлено 28 Nov 2025
Apache2 + mod_fcgid + PHP5 на Fedora 10
Apache2 + mod_fcgid + PHP5 на Fedora 10

Кратко: установка Apache2 + mod_fcgid и запуск PHP5 через php-cgi позволяет исполнять PHP-скрипты от имени владельца файлов (suExec). В этой инструкции показано, как подготовить систему, создать пользователей и vhost’ы, сделать обёртки (wrapper) для php-cgi и настроить виртуальные хосты для двух сайтов. Важно: SELinux должен быть выключен, suExec ограничивает пути, поэтому для каждого сайта нужен собственный стартовый скрипт.

Version 1.0
Author: Falko Timme

Это руководство описывает, как установить Apache2 с mod_fcgid и PHP5 на Fedora 10. mod_fcgid — совместимая альтернатива модулю mod_fastcgi. Он позволяет исполнять PHP-скрипты с правами их владельцев, а не пользователя Apache.

Я не даю гарантий, что это сработает в вашей среде.

1 Предварительная заметка

В этом руководстве используется сервер Fedora 10 с именем host server1.example.com и IP-адресом 192.168.0.100.

Я создам два виртуальных хоста: www.example1.com и www.example2.com, чтобы продемонстрировать работу mod_fcgid.

Перед началом убедитесь, что SELinux отключён. Откройте /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

2 Установка Apache2/mod_fcgid/PHP5

Установите 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.
#

#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 Создание виртуальных хостов для www.example1.com и www.example2.com

В этом примере создаются два хоста: www.example1.com c корнем /var/www/web1/web и www.example2.com с корнем /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

Создаём document root и назначаем владельцев:

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. Wrapper должен принадлежать соответствующему пользователю и группе.

Создаём каталоги для wrapper-скриптов:

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/ → /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

Когда эта схема может не сработать

  • SuExec ограничивает корневой каталог; если ваш php-cgi находится вне /var/www и вы не хотите создавать wrapper’ы, подход не сработает.
  • Если SELinux активен и в режиме enforcing, доступы могут блокироваться — сначала отключите или настройте политики.
  • На современных дистрибутивах Fedora/Ubuntu/PHP версии и пути отличаются. Fedora 10 — устаревшая система.

Альтернативные подходы

  • Использовать php-fpm + модуль mod_proxy_fcgi (современный, рекомендуемый вариант). php-fpm работает как отдельный демон и проще масштабируется.
  • Запускать PHP как модуль Apache (libphp5) — упрощает конфигурацию, но все процессы будут от имени Apache-пользователя (меньше изоляции).
  • Контейнеризация (Docker) для изоляции приложений и управления версиями PHP.

Чек-лист перед запуском (роль-based)

  • Администратор системы:

    • Отключил SELinux или настроил политику.
    • Установил пакеты: httpd, mod_fcgid, php-cli.
    • Создал пользователей и каталоги с корректными правами.
  • DevOps / Dev:

    • Проверил, что php.ini содержит cgi.fix_pathinfo = 1.
    • Протестировал php-cgi запуск вручную.
  • Безопасность:

    • Проверил права на wrapper-скрипты и каталоги.
    • Убедился, что не создаются символические ссылки, ведущие вне /var/www.

Мини‑методология настройки (шаги)

  1. Отключить или настроить SELinux.
  2. Установить httpd, mod_fcgid, php-cli.
  3. Отключить libphp5, если он загружен.
  4. Создать пользователей и документ‑руты.
  5. Создать wrapper-скрипты в /var/www и сделать их собственностью сайтов.
  6. Добавить виртуальные хосты с FCGIWrapper и SuexecUserGroup.
  7. Перезагрузить Apache и проверить логи.

Мини‑шпаргалка конфигурации

  • suExec корень: проверьте /usr/sbin/suexec -V
  • PHPRC=/etc/ → указывает на /etc/php.ini
  • Рекомендуемые права: каталоги 755, wrapper 755, владелец — сайт-пользователь
  • Перезапуск Apache: /etc/init.d/httpd reload

Тесты и критерии приёмки

  • На каждой виртуальной машине разместите index.php со строкой phpinfo(); откройте в браузере — должно отображаться PHP-инфо, и в поле “User” должен быть пользователь сайта (web1/web2).
  • Проверьте логи ошибок Apache (/var/log/httpd/error_log) и лог suexec (/var/log/httpd/suexec.log) на предмет ошибок прав и запуска.

Короткий глоссарий

  • mod_fcgid — модуль Apache для запуска FastCGI-приложений.
  • suExec — механизм Apache для запуска CGI-программ от имени другого пользователя.
  • php-cgi — CGI-версия PHP-интерпретатора.
  • wrapper — shell-скрипт, запускающий php-cgi и находящийся в разрешённом пути suExec.

Замечания по безопасности и миграции

  • Fedora 10 устарела. Для новых установок рассмотрите современные дистрибутивы и PHP-пакеты.
  • Для лучшей производительности и безопасности используйте php-fpm и mod_proxy_fcgi на современных системах.
  • Ограничьте доступ к /var/www/php-fcgi-scripts и следите за правами файлов.

Краткое руководство по откату в случае проблем

  1. Вернуть изменения в /etc/httpd/conf/httpd.conf (удалить добавленные vhost’ы).
  2. Восстановить /etc/httpd/conf.d/php.conf (если вы устанавливали libphp5).
  3. Удалить или изменить wrapper-скрипты и проверить владельцев каталогов.
  4. Включить SELinux (если отключали) и откорректировать политики.

Резюме

  • mod_fcgid + suExec позволяют запускать PHP скрипты с правами владельца файлов.
  • Необходимо создать отдельный wrapper-скрипт в пределах суэкзек‑корня (/var/www) для каждого сайта.
  • Следуйте чек-листу и тестам, проверяйте логи при проблемах.

Важно: адаптируйте примеры под вашу систему — пути, версии PHP и политика безопасности могут отличаться.

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