Установка Apache2 с mod_fcgid и PHP5 на OpenSUSE 11.3
Предварительное примечание
В примерах использован сервер OpenSUSE 11.3 с именем host server1.example.com и IP 192.168.0.100. Для демонстрации будут созданы два виртуальных хоста: www.example1.com и www.example2.com. Документы сайтов расположены в /srv/www/web1/web и /srv/www/web2/web соответственно.
Важно: mod_fcgid — это совместимая альтернатива старому mod_fastcgi. Он позволяет запускать PHP-скрипты с правами владельца файлов, а не от пользователя Apache.
Установка Apache2, mod_fcgid и PHP5
Установите пакеты с помощью YaST/CLI:
yast2 -i apache2 apache2-mod_fcgid php5-fastcgiЕсли PHP уже подключён как модуль Apache, отключите его:
a2dismod php5Включите модули suexec и fcgid:
a2enmod suexec
a2enmod fcgidСоздайте запускные скрипты для сервиса Apache и запустите его:
chkconfig --add apache2
/etc/init.d/apache2 startОткройте файл настроек fastcgi-PHP:
vi /etc/php5/fastcgi/php.iniРаскомментируйте и установите:
[...]
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]Перезапустите Apache:
/etc/init.d/apache2 restartСоздание пользователей, директорий и wrapper-скриптов
Мы будем запускать PHP через suExec. suExec ограничивает корневую директорию для исполняемых файлов. В примере suExec настроен на /srv/www, что видно в выводе:
server1:~ # /usr/sbin/suexec2 -V
-D AP_DOC_ROOT='/srv/www'
-D AP_GID_MIN=96
-D AP_HTTPD_USER='wwwrun'
-D AP_LOG_EXEC='/var/log/apache2/suexec.log'
-D AP_SAFE_PATH='/usr/local/bin:/usr/bin:/bin'
-D AP_UID_MIN=96
-D AP_USERDIR_SUFFIX='public_html'
server1:~ #Поскольку /usr/bin/php-cgi находится вне корня suExec, нельзя вызывать бинарник напрямую из конфигурации vhost. Решение — создать wrapper-скрипт внутри /srv/www, который будет запускать /usr/bin/php-cgi. Для каждого сайта нужен свой скрипт, принадлежащий соответствующему пользователю.
Создаём группы и пользователей сайтов, создаём корни документов:
groupadd web1
groupadd web2
useradd -s /bin/false -d /srv/www/web1 -m -g web1 web1
useradd -s /bin/false -d /srv/www/web2 -m -g web2 web2
chmod 755 /srv/www/web1
chmod 755 /srv/www/web2Создаём директории для документов и назначаем владельцев:
mkdir -p /srv/www/web1/web
chown web1:web1 /srv/www/web1/web
mkdir -p /srv/www/web2/web
chown web2:web2 /srv/www/web2/webСоздаём директории для fcgid-wrapper’ов и сами стартеры:
mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2Файл /srv/www/php-fcgi-scripts/web1/php-fcgi-starter:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiФайл /srv/www/php-fcgi-scripts/web2/php-fcgi-starter аналогичен.
Назначьте права и владельцев:
chmod 755 /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /srv/www/php-fcgi-scripts/web1
chown -R web2:web2 /srv/www/php-fcgi-scripts/web2Пояснения по переменным среды в стартере:
- PHPRC — директория, где лежит php.ini для fastcgi (здесь /etc/php5/fastcgi/).
- PHP_FCGI_MAX_REQUESTS — максимальное число обработанных запросов дочерним процессом перед перезапуском.
- PHP_FCGI_CHILDREN — количество дочерних процессов PHP в рамках одного запускающего процесса.
Настройки этих параметров зависят от нагрузки и объёма памяти на сервере.
Создание виртуальных хостов
Пример конфигурации для www.example1.com (/etc/apache2/vhosts.d/www.example1.com.conf):
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin [email protected]
DocumentRoot /srv/www/web1/web/
SuexecUserGroup web1 web1
PHP_Fix_Pathinfo_Enable 1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /srv/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
Аналогично для www.example2.com с заменой web1 → web2 и путей на /srv/www/web2/web.
Откройте /etc/apache2/httpd.conf и убедитесь, что перед включением vhosts стоит строка NameVirtualHost *:
NameVirtualHost *
Include /etc/apache2/vhosts.d/*.confПеред перезапуском Apache исправьте права suExec-исполняемого файла, иначе вы увидите предупреждение о необходимости SUEXEC wrapper:
chmod 4755 /usr/sbin/suexec2Перезапустите Apache:
/etc/init.d/apache2 restartОтладка и проверка
- Проверьте, что модуль fcgid загружен:
apache2ctl -M | grep fcgidПроверьте, что suExec функционирует без ошибок в логах: /var/log/apache2/suexec.log и /var/log/apache2/error.log.
Создайте простой phpinfo-скрипт в каждом DocumentRoot и откройте в браузере:
- Если видите ошибки 500, проверьте: права файлов/папок, владельца wrapper-скрипта, наличие исполняемого бина /usr/bin/php-cgi и правильность PHPRC.
Частые причины ошибок:
- wrapper-скрипт не исполняемый или принадлежит не тому пользователю;
- путь к php-cgi указан неверно;
- suExec блокирует путь: убедитесь, что wrapper находится в дереве /srv/www;
- директивы Allow/Order в старых версиях Apache настроены некорректно.
Безопасность и рекомендации
- Всегда держите wrapper-скрипты и директории с ними принадлежащими соответствующему владельцу сайта и правами 755.
- Не помещайте исполняемые файлы вне корня suExec.
- Ограничьте PHP_FCGI_CHILDREN и PHP_FCGI_MAX_REQUESTS в соответствии с памятью сервера.
- Отключите отображение ServerSignature и проброс ошибок в браузер (display_errors=Off) для продакшена.
- Используйте AllowOverride только когда действительно нужно; альтернативно применяйте настройки в конфигурации vhost.
Когда этот подход не подходит и альтернативы
Когда стоит рассмотреть альтернативы:
- На новых дистрибутивах и для высоконагруженных приложений лучше использовать php-fpm + mod_proxy_fcgi: производительнее и проще в настройке пулов процессов.
- Если нужно быстрое масштабирование и контейнеризация — применять php-fpm и сокеты/Unix domain sockets.
Короткое сравнение:
- mod_fcgid + suExec: хорошо для запуска PHP с правами владельца, простая изоляция на уровне ОС.
- php-fpm + mod_proxy_fcgi: гибкие пулы, лучшее управление ресурсами, более современная архитектура.
Критерии приёмки
- Apache стартует без ошибок и модули fcgid/suexec загружены.
- phpinfo.php отображается корректно для каждого виртуального хоста и показывает, что PHP работает через CGI/FastCGI.
- Процессы PHP запущены от пользователей web1 и web2 соответственно (проверьте ps aux или lsof).
- Логи не содержат ошибок suExec и fcgid при обработке простых запросов.
Чеклист для ролей
Системный администратор:
- Установил пакеты и включил модули.
- Настроил права для /usr/sbin/suexec2 и wrapper-скриптов.
- Перезапустил Apache и проверил логи.
Разработчик:
- Добавил phpinfo.php и проверил конфигурацию PHP (php.ini) для fastcgi.
- Проверил корректность PATH_INFO в приложении.
Аудитор безопасности:
- Проверил права на каталоги и скрипты.
- Убедился, что display_errors отключён и ServerSignature Off.
Краткая методология внедрения
- Установить пакеты и отключить модуль PHP для Apache.
- Включить suexec и fcgid, настроить php.ini для fastcgi.
- Создать пользователей, директории и wrapper-скрипты в корне suExec.
- Настроить виртуальные хосты с FCGIWrapper и SuexecUserGroup.
- Проверить работу и настроить параметры производительности.
Итог
Следуя этой инструкции, вы получите рабочую конфигурацию Apache2 + mod_fcgid + PHP5 на OpenSUSE 11.3, где PHP-скрипты исполняются с правами владельца сайтов. Это обеспечивает лучшую изоляцию приложений и совместимость с устаревшими сценариями, при этом требует аккуратной настройки прав и контроля процессов.
Важное: рассмотрите переход на php-fpm для современных развертываний и высокой нагрузки.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента