Как настроить Apache2 с mod_fcgid и PHP5 на Fedora 11
Введение
В этом руководстве описано, как установить Apache2 с модулем mod_fcgid и PHP5 на Fedora 11. mod_fcgid — совместимая альтернатива старому mod_fastcgi. Он позволяет запускать PHP-скрипты от имени владельца файлов, а не от имени пользователя Apache.
Важно: перед началом убедитесь, что SELinux отключён, иначе некоторые шаги не сработают.
Примечание: примеры используют сервер с именем host server1.example.com и IP 192.168.0.100. В качестве демонстрации создаются два виртуальных хоста: www.example1.com и www.example2.com.
1. Предварительная проверка и отключение SELinux
Откройте файл конфигурации SELinux и установите режим disabled:
vi /etc/selinux/configНайдите и установите:
SELINUX=disabled
SELINUXTYPE=targetedЧтобы изменения вступили в силу, выполните:
setenforce 02. Установка Apache2, mod_fcgid и PHP5
Установите необходимые пакеты:
yum install httpd mod_fcgid php-cliЕсли PHP уже был установлен как модуль Apache (libphp5.so), отключите модуль — откройте файл /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Перезагрузите Apache:
/etc/init.d/httpd reload3. Создание пользователей, директорий и vhost’ов
Мы создадим два сайта с корнями /var/www/web1/web и /var/www/web2/web. Первый будет принадлежать web1:web1, второй — web2: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Почему нужен wrapper-скрипт для PHP
suExec ограничивает исполняемые пути документом-рутом (AP_DOC_ROOT). Выполнение /usr/bin/php-cgi напрямую не допускается, если он находится вне /var/www. Поскольку suExec запрещает символические ссылки, создаём обёртки (wrapper) внутри /var/www, которые будут запускать системный php-cgi. Каждая обёртка должна принадлежать соответствующему пользователю сайта.
Создаём директории для обёрток:
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2Создаём 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-cgivi /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_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Настройка виртуальных хостов
Добавьте следующие vhost’ы в конец /etc/httpd/conf/httpd.conf (проверьте пути и замените email, если нужно):
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
После изменения конфигурации перезагрузите Apache:
/etc/init.d/httpd reloadПроверки и отладка
- Убедитесь, что модуль mod_fcgid загружен: проверьте вывод
httpd -Mилиapachectl -M. - Проверить права файлов и владельцев директорий — скрипты должны принадлежать web1:web1 или web2:web2.
- Журналы: /var/log/httpd/error_log и /var/log/httpd/access_log, а также /var/log/httpd/suexec.log (если включён) — первые источники информации при ошибках.
- Тестовый PHP-файл: положите в документ-рут простой info.php с
и откройте его в браузере.
Распространённые ошибки и решения
- 403 Forbidden при попытке выполнить .php: проверьте Options +ExecCGI и права доступа в каталоге, а также отсутствие deny-by-default в конфигурации.
- PHP не выполняется, скачивается как файл: проверьте AddHandler и FCGIWrapper, убедитесь, что модуль mod_fcgid активен.
- Ошибки suexec: проверьте, что путь к обёртке находится в пределах AP_DOC_ROOT (
/var/www) и что скрипт принадлежит нужному пользователю и имеет права 755.
Критерии приёмки
- При открытии тестового info.php в браузере отображается страница phpinfo().
- Процессы PHP запускаются от имени соответствующих пользователей web1 или web2 (проверка ps aux | grep php-cgi).
- Логи Apache и suexec не содержат критических ошибок при простом запросе.
Методология (коротко)
- Подготовить среду (SELinux, пакеты). 2. Заблокировать встроенный PHP-модуль. 3. Создать пользователей и деревья каталогов. 4. Создать suExec-совместимые обёртки для php-cgi. 5. Настроить vhost’ы с FCGIWrapper. 6. Проверить и отладить.
Чеклист перед продакшеном
- SELinux отключён или настроен корретно.
- Установлены httpd, mod_fcgid, php-cli.
- Отключён libphp5 как модуль Apache, если используется mod_fcgid.
- Обёртки php-fcgi-starter находятся в /var/www и принадлежат правильным пользователям.
- Права и владельцы каталогов корректны (не writable для всех).
- Журналы логов доступны и ротация настроена.
- Тестовое phpinfo отображается корректно.
Безопасность и рекомендации
- Запускайте PHP-процессы под отдельными пользователями для каждого виртуального хоста — это ограничит доступ между сайтами.
- Не давайте каталогам веб-сайтов права на запись для всех; используйте минимально необходимые права.
- Настройте ротацию логов и мониторинг ошибок.
- Рассмотрите ограничение доступа к /var/www/php-fcgi-scripts/ и проверяйте содержимое starter-скриптов.
Глоссарий (в одну строку)
- mod_fcgid — модуль Apache для запуска FastCGI-приложений, совместим с mod_fastcgi.
- suExec — механизм Apache, позволяющий запускать CGI-программы от имени конкретного UNIX-пользователя.
- FCGIWrapper — директива, указывающая обработчик FastCGI для файлов с данным расширением.
Вывод
Настройка Apache2 с mod_fcgid и PHP5 на Fedora 11 даёт вам гибкость и безопасность за счёт запуска PHP-процессов под владельцами сайтов. Внимательно проверьте пути для suExec, права на файлы и конфигурацию vhost’ов. После базовой настройки выполните тесты и настройте мониторинг.
Важно: если ваша система использует современные версии ОС или PHP, рассмотрите обновление до поддерживаемых релизов и современных методов (например, php-fpm).
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента