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

Настройка Apache2 с mod_fcgid и PHP5 на Mandriva 2010.1 Spring

• 6 min read • DevOps • Обновлено 26 Nov 2025
Apache2 + mod_fcgid + PHP5 на Mandriva 2010.1
Apache2 + mod_fcgid + PHP5 на Mandriva 2010.1

TL;DR

Коротко: пошаговое руководство по установке Apache2 с модулем mod_fcgid и запуску PHP5 через suExec на Mandriva 2010.1 Spring. Показываю создание отдельных виртуальных хостов, wrapper-скриптов для php-fcgi, отдельные php.ini для сайтов и способы менять отдельные настройки PHP. Включены советы по безопасности, проверке и отладке.

Важно: этот гайд предполагает доступ root и базовые навыки работы в shell. Тестируйте изменения на стенде перед продакшеном.

Введение

Версия 1.0
Автор: Falko Timme

Это руководство объясняет, как установить Apache2 с mod_fcgid и PHP5 на Mandriva 2010.1 Spring. mod_fcgid — современная замена mod_fastcgi. Он позволяет запускать PHP-скрипты под учётной записью владельца файлов, а не под общим пользователем Apache.

Я не даю гарантий, что инструкции сработают в вашей среде без адаптации.

Что вы получите в результате

  • Apache2 с mod_fcgid, работающий в MPM worker.
  • Запуск PHP-FastCGI через suExec, чтобы процессы PHP выполнялись под пользователями сайтов.
  • Возможность использовать отдельный php.ini для каждого сайта.
  • Примеры конфигурации vhost и wrapper-скриптов.

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

В примере используется сервер Mandriva 2010.1 Spring с хостнеймом server1.example.com и IP 192.168.0.100.

Будут созданы два виртуальных хоста: www.example1.com и www.example2.com. Они демонстрируют работу mod_fcgid с разными юзерами и отдельными php.ini.

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

Обновите базу пакетов:

urpmi.update -a

Установите необходимые пакеты. Обратите внимание: mod_fcgid требует apache-mpm-worker вместо apache-mpm-prefork, поэтому apache-mod_php (модуль для prefork) будет удалён, если установлен:

urpmi apache-mpm-worker apache-mod_fcgid php-fcgi apache-mod_suexec

Откройте файл настроек PHP-FCGI и убедитесь, что включена фиксация PATH_INFO:

vi /etc/php-cgi-fcgi.ini

Найдите и раскомментируйте:

cgi.fix_pathinfo=1

Перезапустите Apache:

/etc/init.d/httpd restart

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

Будем хранить сайты в /var/www/web1/web и /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

Проверим конфигурацию suExec. Документ-рут suExec ограничен /var/www, поэтому бинарник PHP (/usr/bin/php-fcgi) находится вне допускаемой области и не может быть вызван напрямую. suExec также не разрешает символические ссылки. Решение — создать wrapper-скрипты в поддиректории внутри /var/www, которые будут запускаться suExec и вызывать /usr/bin/php-fcgi.

Посмотрим опции suExec:

/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_SUEXEC_UMASK=077
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"
[root@server1 ~]#

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

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

Создаём starter-скрипты. Для 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-fcgi

И для 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-fcgi

Короткие пояснения:

  • PHPRC указывает директорию, где PHP ищет php.ini (PHPRC=/etc/ означает /etc/php.ini).
  • PHP_FCGI_MAX_REQUESTS — число запросов до перезапуска процесса fcgid.
  • PHP_FCGI_CHILDREN — число дочерних процессов PHP в одном экземпляре.

Делаем 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

Добавляем vhost-конфигурации в конец /etc/httpd/conf/httpd.conf:

vi /etc/httpd/conf/httpd.conf

Добавьте блоки:

[...]

  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  PHP_Fix_Pathinfo_Enable 1


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

4 Тестирование

Создайте тестовый PHP-файл для www.example1.com:

vi /var/www/web1/web/info.php

Содержимое:

Откройте в браузере http://www.example1.com/info.php — в строке Server API должен быть CGI/FastCGI.

/Снимок экрана с phpinfo и строкой Server API=CGI/FastCGI

5 Отдельный php.ini для каждого сайта

Поскольку используется wrapper-скрипт, можно указать другую директорию PHPRC для каждого сайта и тем самым использовать свой php.ini.

Для примера скопируем системный конфиг в директорию сайта web2 и сделаем его владельцем web2:

cp /etc/php-cgi-fcgi.ini /var/www/web2/
chown web2:web2 /var/www/web2/php.ini

Отредактируйте /var/www/php-fcgi-scripts/web2/php-fcgi-starter и укажите PHPRC=/var/www/web2/:

#!/bin/sh
PHPRC=/var/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-fcgi

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

/ etc/init.d/httpd reload

Создайте info.php в web2 и откройте http://www.example2.com/info.php. В поле Loaded Configuration File должен быть указан /var/www/web2/php-cgi-fcgi.ini или /var/www/web2/php.ini в зависимости от версии PHP.

/Скриншот phpinfo, показывающий путь к загруженному конфигу в каталоге сайта

6 Изменение отдельных настроек PHP

Можно не копировать весь php.ini, а задать отдельные настройки через ключ -d в вызове php-fcgi. Например, чтобы отключить magic_quotes_gpc для web2:

vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter

Измените exec-строку:

#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-fcgi -d magic_quotes_gpc=off

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

/ etc/init.d/httpd reload

Откройте info.php и проверьте значение magic_quotes_gpc.

/Скриншот phpinfo, показывающий magic_quotes_gpc=Off

Когда этот подход не подходит

  • Если вы хотите использовать модуль mod_php (интегрированный в Apache), так как он проще для небольших сайтов.
  • Если ваш сайт требует расширений, которые доступны только в модуле apache-mod_php, и вы не хотите переходить на worker MPM.
  • На серверах с очень высокой плотностью сайтов и ограниченными ресурсами лучше рассмотреть php-fpm, который даёт более гибкий пул процессов и управление.

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

  • mod_php (apache-mod_php) — проще, но все процессы работают под пользователем Apache.
  • php-fpm + mod_proxy_fcgi — современное и производительное решение для пулов PHP, хорошо работает с Nginx и Apache через proxy.
  • mod_fastcgi — устаревший вариант, лучше использовать mod_fcgid.

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

  1. Обновить пакеты.
  2. Установить apache-mpm-worker, mod_fcgid, php-fcgi, suexec.
  3. Проверить suExec docroot.
  4. Создать пользователей и директории сайтов.
  5. Создать wrapper-скрипты в пределах /var/www.
  6. Настроить vhost с FCGIWrapper и SuexecUserGroup.
  7. Перезагрузить и протестировать phpinfo().
  8. Применить права и настройки безопасности.

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

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

  • Убедиться, что установлен apache-mpm-worker.
  • Проверить параметры suExec и AP_DOC_ROOT.
  • Создать пользователей сайтов и выставить права.
  • Настроить vhost и FCGIWrapper.
  • Настроить логирование и мониторинг.

Разработчик сайта:

  • Разместить код в /var/www//web.
  • Проверить права файлов на владельца сайта.
  • При необходимости подготовить php.ini в корне сайта.
  • Тестировать через phpinfo() и логи.

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

  • phpinfo() возвращает Server API: CGI/FastCGI.
  • Loaded Configuration File указывает на ожидаемый php.ini для каждого сайта.
  • Процессы PHP выполняются от имени пользователя сайта (проверить ps aux или логирование).
  • Нет ошибок в error_log Apache и в suexec_log при старте процессов.

Отладка и типичные проблемы

  1. Ошибка suExec: «suexec policy violation».

    • Причина: скрипт или директория расположены вне AP_DOC_ROOT или имеют неправильные права/владельца.
    • Решение: переместить wrapper внутрь /var/www, выставить владельцем соответствующего пользователя и права 755.
  2. 500 Internal Server Error при вызове .php.

    • Проверьте /var/log/httpd/error_log и /var/log/httpd/suexec_log.
    • Убедитесь, что FCGIWrapper указывает на существующий исполняемый файл и он помечен как исполняемый.
  3. PHP запускается как пользователь apache, а не как web1/web2.

    • Проверьте SuexecUserGroup в конфигурации vhost и права директорий.
    • Убедитесь, что используете suExec и FCGIWrapper в пределах AP_DOC_ROOT.
  4. PHP не видит нужный php.ini.

    • Проверьте PHPRC в starter-скрипте.
    • Убедитесь, что в указанной директории есть php.ini и права позволяют чтение владельцу процесса.

Безопасность и жёсткие рекомендации

  • Никогда не давайте право на запись веб-каталога всем и не ставьте 777.
  • Wrapper-скрипты и каталоги должны принадлежать пользователю сайта и иметь права 755.
  • Ограничьте доступ к конфигурационным файлам (php.ini) — права 644 или 640 в зависимости от настроек.
  • Логи suExec и Apache храните с ограниченным доступом и периодически просматривайте на предмет аномалий.

Шаблон быстрой проверки после развертывания

  • Сеть: сайт доступен по HTTP.
  • PHP: phpinfo() отображается и Server API — CGI/FastCGI.
  • Права: каталоги и wrapper принадлежат нужным пользователям.
  • Логи: отсутствие критичных ошибок.

Краткая галерея кейсов и когда не стоит использовать mod_fcgid

  • Малые одностраничные сайты без требований к привязке к владельцу — проще использовать mod_php.
  • Многопользовательские хостинги или мультисайты с высокими SLA — рассмотрите php-fpm для лучшего управления пулами и мониторинга.

1-строчный словарь терминов

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

Полезные ссылки

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

Этот гайд показывает надёжный способ запускать PHP через mod_fcgid и suExec, обеспечивая выполнение PHP-процессов под пользователями сайтов и возможность иметь отдельные php.ini. Подходит для сред, где важна изоляция сайтов по владельцам. В качестве альтернативы рассмотрите 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 быстро