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

Установка Apache2 с mod_fcgid и PHP5 на openSUSE 12.3

• 6 min read • Системное администрирование • Обновлено 21 Nov 2025
Apache2 + mod_fcgid и PHP5 на openSUSE 12.3
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 (вне блока ) строку PHP_Fix_Pathinfo_Enable 1. Например:

vi /etc/apache2/conf.d/mod_fcgid.conf

В файле добавьте:

PHP_Fix_Pathinfo_Enable 1

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

systemctl restart apache2.service

3 Создание виртуальных хостов для 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.service

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

Создайте тестовый скрипт для одного сайта:

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

Содержимое:

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

Страница phpinfo с указанием 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.

phpinfo показывает загруженный 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.

phpinfo показывает magic_quotes_gpc Off для сайта

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)

Ментальная модель: «один процесс = один владелец». Существенные шаги:

  1. Разделите окружения по владельцам (users/groups).
  2. Поместите все исполняемые стартеры в корень suExec (/srv/www).
  3. Настройте индивидуальные конфиги PHP через PHPRC или -d.
  4. Тестируйте через 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-скриптов.

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

Конец руководства.

Поделиться: 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 быстро