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

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

• 5 min read • Серверы • Обновлено 28 Nov 2025
Apache2, mod_fcgid и PHP5 на Fedora 14
Apache2, mod_fcgid и PHP5 на Fedora 14

Версия 1.0
Автор: Falko Timme
Следите за мной в Twitter

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

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

Я не даю гарантии, что инструкция сработает в вашей среде — проверяйте конфигурацию и делайте бэкапы.

Я использую сервер Fedora 14 с именем server1.example.com и IP 192.168.0.100.

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

Важно: перед началом убедитесь, что SELinux отключён или настроен так, чтобы не блокировать выполнение PHP через mod_fcgid.

Откройте /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

Установка 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 # # # 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:

vi /etc/php.ini

и раскомментируйте строку cgi.fix_pathinfo = 1 (это важно для корректного определения PATH_INFO в CGI):

| [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=1 [...] |

Откройте /etc/httpd/conf.d/fcgid.conf:

vi /etc/httpd/conf.d/fcgid.conf

и добавьте строку PHP_Fix_Pathinfo_Enable 1 (она не должна находиться внутри блока ):

| # This is the Apache server configuration file for providing FastCGI support # through mod_fcgid # # Documentation is available at # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html LoadModule fcgid_module modules/mod_fcgid.so # Use FastCGI to process .fcg .fcgi & .fpl scripts AddHandler fcgid-script fcg fcgi fpl # Sane place to put sockets and shared memory file FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm PHP_Fix_Pathinfo_Enable 1 |

Перезагрузите Apache:

/etc/init.d/httpd reload

Создание виртуальных хостов для www.example1.com и www.example2.com

В этом примере я создам два vhost: www.example1.com с DocumentRoot /var/www/web1/web (владелец web1) и www.example2.com с DocumentRoot /var/www/web2/web (владелец 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 ~]#

Так как /usr/bin/php-cgi находится вне AP_DOC_ROOT, нельзя вызывать php-cgi напрямую из vhost через suExec. suExec также не разрешает символические ссылки. Решение — создать для каждого сайта обёртку-скрипт внутри /var/www, которая будет запускать /usr/bin/php-cgi. Скрипт должен принадлежать соответствующему пользователю сайта.

Создайте каталоги обёрток:

mkdir -p /var/www/php-fcgi-scripts/web1  
mkdir -p /var/www/php-fcgi-scripts/web2

Создайте /var/www/php-fcgi-scripts/web1/php-fcgi-starter:

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 |

Создайте /var/www/php-fcgi-scripts/web2/php-fcgi-starter:

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 — максимум запросов до перезапуска процесса. 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 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 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. Создайте в каждом DocumentRoot файл info.php с содержимым:
  1. Откройте в браузере http://www.example1.com/info.php и http://www.example2.com/info.php. Важно убедиться, что phpinfo показывает использование CGI/FastCGI и что владелец процесса соответствует владельцу сайта.

  2. Если страница не открывается: проверьте /var/log/httpd/error_log, /var/log/httpd/access_log и /var/log/httpd/suexec.log.

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

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

  • Использовать PHP-FPM вместе с модулем mod_proxy_fcgi (предпочтительный подход в современных системах). PHP-FPM даёт более гибкое управление процессами и лучше масштабируется.
  • Оставить PHP как модуль Apache (mod_php) — проще в настройке, но все скрипты выполняются от пользователя Apache, что хуже с точки зрения изоляции.
  • Использовать контейнеризацию (Docker) и запускать каждый сайт в отдельном контейнере с собственным PHP-FPM.

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

  • SELinux включён и не настроен для разрешения модулю mod_fcgid или suExec.
  • suExec AP_DOC_ROOT не включает путь к исполняемой обёртке.
  • Файлы и каталоги имеют неправильные права/владельца.
  • Установлен модуль PHP как встроенный в Apache (libphp) и он конфликтует с mod_fcgid.

Контрольный список ролей

  • Администратор: установить пакеты, настроить SELinux, проверить suexec -V, настроить автозапуск httpd.
  • DevOps/Инженер по деплою: создать пользователей сайтов, скрипты-обёртки, настроить FCGIWrapper и перезагрузить сервисы.
  • Веб-разработчик: разместить info.php и тестовые скрипты, проверить phpinfo и права доступа.

Мини-методология внедрения

  1. Подготовка окружения: бэкап конфигов, отключение SELinux (или настройка).
  2. Установка пакетов и отключение mod_php при необходимости.
  3. Подготовка пользователей и директорий.
  4. Создание обёрток и назначение прав.
  5. Настройка vhost и тестирование.
  6. Мониторинг логов и корректировка параметров PHP_FCGI_CHILDREN/PHP_FCGI_MAX_REQUESTS.

Критерии приёмки

  • phpinfo отображается для каждого сайта и показывает запуск через CGI/FastCGI.
  • Процессы PHP запущены с UID соответствующего пользователя сайта.
  • Логи не содержат ошибок суExec или mod_fcgid при обработке запросов.
  • Доступность сайта подтверждена из браузера и/или curl.

Небольшой глоссарий

  • mod_fcgid — модуль Apache для поддержки FastCGI.
  • suExec — механизм Apache для запуска CGI-скриптов от имени конкретного пользователя.
  • FCGIWrapper — директива, указывающая обёртку для обработки .php через FastCGI.

Советы по безопасности

  • Не давайте обёрткам права записи посторонним пользователям.
  • Ограничьте права на каталоги до минимально необходимых (755 для директорий, 644 для файлов).
  • Следите за логами /var/log/httpd/suexec.log.
  • Рассмотрите перевод на PHP-FPM и изоляцию сайтов контейнерами для лучшей безопасности.

Заключение

Эта инструкция показывает, как запустить Apache2 с mod_fcgid и PHP5 на Fedora 14, чтобы PHP-скрипты выполнялись с правами владельца сайта. Варианты улучшения включают PHP-FPM, контейнеризацию и более строгую настройку SELinux. Проводите тестирование после каждого шага и контролируйте логи.

Ключевые команды и конфиги приведены выше — используйте их как шаблоны и адаптируйте под вашу инфраструктуру.

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