Установка Apache2 с mod_fcgid и PHP5 на openSUSE 12.3
Кратко: установите apache2, mod_fcgid и пакет php5-fastcgi, отключите модуль php5 как модуль Apache, включите suexec и fcgid, создайте для каждого сайта wrapper-скрипт в пределах /srv/www, настройте vhost с FCGIWrapper и SuexecUserGroup, при необходимости используйте отдельный php.ini или флаги -d в wrapper. Тестируйте через info.php и проверьте Server API — должен быть CGI/FastCGI.
Введение и цель
В этом руководстве показано, как установить и настроить Apache2 с модулем mod_fcgid и PHP5 на сервере openSUSE 12.3. mod_fcgid — совместимая современная альтернатива старому mod_fastcgi. Он позволяет запускать PHP-скрипты с правами владельца файлов, а не под пользователем Apache, что повышает безопасность и изоляцию сайтов.
Кому полезно: сисадминам и DevOps-инженерам, которым нужно хостить несколько веб-сайтов с разными настройками PHP на одном сервере.
Опорные термины:
- suExec: модуль Apache, который запускает CGI/FCGI процессы от имени владельца сайта.
- FCGIWrapper: директива Apache для привязки расширения (.php) к исполняемому FCGI-стартеру.
1 Предварительная заметка
В примере используется сервер openSUSE 12.3 с hostname server1.example.com и IP 192.168.0.100. Создаём два vhost: www.example1.com и www.example2.com, чтобы продемонстрировать независимую настройку PHP для каждого сайта.
2 Установка Apache2, mod_fcgid и PHP5
Установите нужные пакеты:
zypper install apache2 apache2-mod_fcgid php5-fastcgiЕсли PHP уже установлен как модуль Apache, отключите его:
a2dismod php5Включите модули suexec и fcgid:
a2enmod suexec
a2enmod fcgidСоздайте автозапуск и запустите Apache:
systemctl enable apache2.service
systemctl start apache2.serviceОткройте конфигурацию PHP для fastcgi:
vi /etc/php5/fastcgi/php.iniИ раскомментируйте или установите:
cgi.fix_pathinfo=1Добавьте в конфиг mod_fcgid (вне блока
vi /etc/apache2/conf.d/mod_fcgid.confВ файле добавьте:
PHP_Fix_Pathinfo_Enable 1
Перезапустите Apache:
systemctl restart apache2.service3 Создание виртуальных хостов для www.example1.com и www.example2.com
В примере документ-руты:
- /srv/www/web1/web — для www.example1.com (владелец web1:web1)
- /srv/www/web2/web — для www.example2.com (владелец web2:web2)
Создайте группы и пользователей:
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Проверьте документный корень suExec — suExec не позволит запускать бинарники, расположенные вне корня. Команда:
/usr/sbin/suexec2 -VВыведет, например:
-D AP_DOC_ROOT="/srv/www"
...Из-за этого нельзя вызывать /usr/bin/php-cgi напрямую из /usr/sbin/suexec2. Решение: создать wrapper-скрипт (starter) для каждого сайта внутри /srv/www, который будет вызывать /usr/bin/php-cgi. Скрипт должен принадлежать пользователю сайта.
Создайте каталоги для wrapper-скриптов:
mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2Пример содержимого starter-скрипта (для web1):
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiСоздайте аналогичный скрипт для web2. Объяснения параметров:
- PHPRC — путь к директории, где находится php.ini (например, /etc/php5/fastcgi/).
- PHP_FCGI_MAX_REQUESTS — число запросов до перезапуска процесса.
- PHP_FCGI_CHILDREN — число дочерних процессов PHP (RFC зависит от памяти и нагрузки).
Сделайте скрипты исполняемыми и назначьте владельцев:
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Создайте vhost для 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
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 и путей.
Откройте /etc/apache2/httpd.conf и перед Include /etc/apache2/vhosts.d/.conf добавьте строку NameVirtualHost :80:
NameVirtualHost *:80
Include /etc/apache2/vhosts.d/*.confПеред перезапуском убедитесь, что suExec имеет корректные права (иначе появится предупреждение “SuexecUserGroup directive requires SUEXEC wrapper.”):
chmod 4755 /usr/sbin/suexec2Перезапустите Apache:
systemctl restart apache2.service4 Тестирование
Создайте тестовый скрипт для одного сайта:
vi /srv/www/web1/web/info.phpСодержимое:
Откройте http://www.example1.com/info.php. В строке Server API должен отображаться CGI/FastCGI.

5 Отдельный php.ini для каждого сайта
Поскольку у каждого сайта свой wrapper-скрипт, можно назначать индивидуальный php.ini. Пример: скопировать глобальный php.ini в директорию сайта и настроить PHPRC в wrapper.
cp /etc/php5/fastcgi/php.ini /srv/www/web2/
chown web2:web2 /srv/www/web2/php.iniИзмените /srv/www/php-fcgi-scripts/web2/php-fcgi-starter:
#!/bin/sh
PHPRC=/srv/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiПерезапустите Apache и проверьте info.php — поле Loaded Configuration File должно указывать /srv/www/web2/php.ini.

6 Изменение отдельных настроек PHP
Вместо полного php.ini можно задать отдельные параметры через опцию -d в запускающем бинарнике. Пример: отключить magic_quotes_gpc для web2:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi -d magic_quotes_gpc=offПерезапустите Apache и проверьте через info.php.

7 Устранение неполадок — чеклист
Важно: большинство проблем связано с правами, расположением скриптов и настройками suExec. Проверьте по порядку:
- Проверить права и владельцев директорий и starter-скриптов (chown, chmod).
- Убедиться, что PHPRC указывает на директорию с php.ini.
- Убедиться, что FCGIWrapper указывает на существующий исполняемый файл внутри AP_DOC_ROOT (/srv/www).
- Проверить логи Apache и /var/log/apache2/suexec.log на ошибки suExec.
- Убедиться, что модуль php5 отключён (a2dismod php5), иначе PHP может работать как модуль и конфликтовать.
- Выполнить systemctl status apache2.service и journalctl -xe для деталей при падениях.
8 Безопасность и рекомендации по жёсткому профилю
- Запускайте каждый сайт под отдельным пользователем и группой.
- Ограничьте доступ к /srv/www/* и уберите права на запись для групп/прочих, если не нужно.
- Не размещайте исполняемые файлы вне AP_DOC_ROOT, иначе suExec их не выполнит.
- Следите за версией PHP — PHP5 устарел и содержит уязвимости; по возможности планируйте миграцию на поддерживаемую версию.
- Логи suExec полезны для аудита: /var/log/apache2/suexec.log.
9 Альтернативные подходы и когда это не сработает
Альтернативы:
- mod_php (модуль Apache) — проще, но все сайты будут работать от Apache-пользователя; хуже по безопасности и изоляции.
- PHP-FPM (с pool-ами для каждого сайта) — более современный и гибкий способ; не требует suExec, лучше масштабируется.
Когда mod_fcgid+suExec не подходит:
- Если нужно исполнять бинарники вне /srv/www и нельзя менять layout — suExec запрещает этот сценарий.
- Если требуется высокая плотность многопоточности и низкая задержка — PHP-FPM часто предпочтительнее.
Рекомендация: для новых развёртываний рассмотреть PHP-FPM с systemd socket/pool-конфигурацией вместо mod_fcgid.
10 Ментальные модели и рабочая методика (mini-methodology)
Ментальная модель: «один процесс = один владелец». Существенные шаги:
- Разделите окружения по владельцам (users/groups).
- Поместите все исполняемые стартеры в корень suExec (/srv/www).
- Настройте индивидуальные конфиги PHP через PHPRC или -d.
- Тестируйте через phpinfo и логи.
Методика внедрения (пошагово): подготовка → установка пакетов → настройка mod_fcgid/suexec → создание wrapper → настройка vhost → тест → фикс прав и безопасность → документирование.
11 Ролевые чек-листы
Для системного администратора:
- Установить пакеты и включить модули.
- Настроить права на /usr/sbin/suexec2 и каталоги /srv/www.
- Создать пользователей и wrapper-скрипты.
- Настроить vhost и NameVirtualHost.
- Протестировать и задокументировать.
Для разработчика сайта:
- Убедиться, что код не полагается на magic_quotes или специфические расширения.
- Покрыть приложение тестами и проверить работу под пользовательскими правами.
- Сообщить администратору, если нужны дополнительные php.ini параметры.
12 Критерии приёмки
- Доступность info.php по адресу сайта и Server API = CGI/FastCGI.
- Loaded Configuration File указывает на ожидаемый php.ini (если задано).
- Процессы PHP работают от владельца сайта (проверяется ps aux | grep php-cgi).
- В логах отсутствуют ошибки suExec и модулей.
13 Диаграмма принятия решения (Mermaid)
flowchart TD
A[Начало: выбрать схему запуска PHP] --> B{Нужно ли изоляция по пользователю?}
B -- Да --> C[Использовать mod_fcgid + suexec или PHP-FPM с отдельными пулами]
B -- Нет --> D[Использовать mod_php для простоты]
C --> E{Требуется запуск бинарников вне /srv/www?}
E -- Да --> F[Использовать PHP-FPM или перенести исполняемые файлы]
E -- Нет --> G[Продолжить настройку mod_fcgid + wrapper]
G --> H[Тестирование и деплой]14 Сводка и советы по миграции
Если вы поддерживаете старые сайты на PHP5, планируйте поэтапную миграцию на поддерживаемые версии PHP и современный FPM-подход. Для существующих развёртываний mod_fcgid с suExec даёт хороший компромисс безопасности и простоты, но требует аккуратной настройки прав и расположения wrapper-скриптов.
Полезные ссылки:
- mod_fcgid: http://fastcgi.coremail.cn/
- Apache: http://httpd.apache.org/
- PHP: http://www.php.net/
- OpenSUSE: http://www.opensuse.org/
Конец руководства.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента