Настройка Apache2 с mod_fcgid и PHP5 на Mandriva 2010.1 Spring
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 restart3 Создание виртуальных хостов для 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 reload4 Тестирование
Создайте тестовый PHP-файл для www.example1.com:
vi /var/www/web1/web/info.phpСодержимое:
Откройте в браузере http://www.example1.com/info.php — в строке 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.

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.

Когда этот подход не подходит
- Если вы хотите использовать модуль 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.
Мини-методология развертывания
- Обновить пакеты.
- Установить apache-mpm-worker, mod_fcgid, php-fcgi, suexec.
- Проверить suExec docroot.
- Создать пользователей и директории сайтов.
- Создать wrapper-скрипты в пределах /var/www.
- Настроить vhost с FCGIWrapper и SuexecUserGroup.
- Перезагрузить и протестировать phpinfo().
- Применить права и настройки безопасности.
Контрольные списки по ролям
Администратор сервера:
- Убедиться, что установлен 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 при старте процессов.
Отладка и типичные проблемы
Ошибка suExec: «suexec policy violation».
- Причина: скрипт или директория расположены вне AP_DOC_ROOT или имеют неправильные права/владельца.
- Решение: переместить wrapper внутрь /var/www, выставить владельцем соответствующего пользователя и права 755.
500 Internal Server Error при вызове .php.
- Проверьте /var/log/httpd/error_log и /var/log/httpd/suexec_log.
- Убедитесь, что FCGIWrapper указывает на существующий исполняемый файл и он помечен как исполняемый.
PHP запускается как пользователь apache, а не как web1/web2.
- Проверьте SuexecUserGroup в конфигурации vhost и права директорий.
- Убедитесь, что используете suExec и FCGIWrapper в пределах AP_DOC_ROOT.
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-приложения.
Полезные ссылки
- mod_fcgid: http://fastcgi.coremail.cn/
- Apache: http://httpd.apache.org/
- PHP: http://www.php.net/
- Mandriva: http://www2.mandriva.com/
Краткое резюме
Этот гайд показывает надёжный способ запускать PHP через mod_fcgid и suExec, обеспечивая выполнение PHP-процессов под пользователями сайтов и возможность иметь отдельные php.ini. Подходит для сред, где важна изоляция сайтов по владельцам. В качестве альтернативы рассмотрите php-fpm для более гибкого управления пулами.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента