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

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

• 4 min read • Серверы • Обновлено 28 Nov 2025
Apache2 с mod_fcgid и PHP5 на Fedora 13
Apache2 с mod_fcgid и PHP5 на Fedora 13

Version 1.0
Author: Falko Timme
Следите за мной в Twitter

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

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

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

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

Я создам два Apache-виртуальных хоста в примере: 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 был уже установлен с 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 # # # 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:

| [...] ; 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 (в отличие от предыдущих версий Fedora, в 13-й версии эта директива не должна находиться внутри , иначе появится ошибка: PHP_Fix_Pathinfo_Enable cannot occur within section):

| # 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

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

Я создам два виртуальных хоста: www.example1.com (DocumentRoot /var/www/web1/web) и www.example2.com (DocumentRoot /var/www/web2/web). Хост www.example1.com будет принадлежать пользователю/группе 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 ~]#

Поэтому нельзя вызывать PHP-исполняемый файл (/usr/bin/php-cgi) напрямую из-за того, что он находится за пределами корня suExec. suExec также не допускает символических ссылок. Единственный способ — создать обёртку (wrapper script) для каждого сайта в подпапке /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
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 |

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.

Скрипты php-fcgi-starter должны быть исполняемыми, и они (а также директории, в которых находятся) должны принадлежать пользователю и группе сайта:

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

Теперь создадим Apache-виртуальные хосты для www.example1.com и www.example2.com. Добавьте следующие два 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 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

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

  • SELinux включён — suExec и mod_fcgid могут блокироваться.
  • Неправильные права или владелец обёрток — suExec отклонит запуск.
  • Если php-cgi находится в нестандартном пути, скорректируйте exec-путь в обёртке.
  • Если на сервере уже используется PHP как модуль (libphp5.so) — убедитесь, что вы отключили модуль, чтобы не было конфликтов обработчиков .php.

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

  • Использовать PHP-FPM (php-fpm) с mod_proxy_fcgi — современная и производительная альтернатива mod_fcgid.
  • Оставить PHP как модуль Apache (меньше процессов, но все скрипты выполняются от пользователя apache).
  • Использовать nginx + php-fpm для разделения фронта и обработки PHP.

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

  • Администратор сервера: проверить SELinux, установить пакеты, настроить автозапуск httpd.
  • Разработчик/владелец сайта: создать директории, загрузить код в /var/www/webX/web, проверить права.
  • DevOps/инженер безопасности: убедиться в ограничениях FCGIWrapper, логировании и ротации логов.

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

  • Apache слушает порт 80 и отвечает на запросы к обоим виртуальным хостам.
  • PHP-скрипт выполняется под пользователем web1 для первого хоста и web2 для второго.
  • В логах /var/log/httpd и /var/log/httpd/suexec.log нет ошибок запуска obёрток.
  • Нет конфликтов обработчиков .php (только mod_fcgid для .php).

Минимальная методология развертывания (быстро)

  1. Отключить SELinux и проверить setenforce.
  2. Установить httpd, mod_fcgid, php-cli.
  3. Отключить модуль libphp5, если он загружен.
  4. Настроить php.ini (cgi.fix_pathinfo=1).
  5. Создать директории, пользователей и обёртки php-fcgi.
  6. Добавить vhost-конфигурации и перезагрузить Apache.
  7. Проверить выполнение PHP-скрипта и логи.

Рекомендации по безопасности

  • Держите права файлов минимальными (755 для директорий, 644 для файлов, исполняемые только там, где нужно).
  • Отключайте показ ошибок для продакшн-сайтов (display_errors=Off в php.ini).
  • Ограничьте доступ к директориям через AllowOverride и Options.
  • Настройте регулярную ротацию логов и мониторинг suexec.log.

Короткая сводка

  • mod_fcgid позволяет запускать PHP под правами владельца скрипта через suExec.
  • Требуется обёртка-скрипт в пределах AP_DOC_ROOT (/var/www), вызывающая /usr/bin/php-cgi.
  • Важно корректно настроить права, владельцев и параметры php-fcgi-starter.

Важно: адаптируйте пути и параметры PHP_FCGI_CHILDREN / PHP_FCGI_MAX_REQUESTS под нагрузку вашего сервера.

Сводка ключевых шагов: установка пакетов → отключение модуля PHP → настройка php.ini и fcgid.conf → создание пользователей/директорий → обёртки для php-cgi → конфигурация vhost → перезагрузка Apache.

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