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

Как настроить Apache2 с mod_fcgid и PHP5 на Debian Etch

5 min read Сервер Обновлено 28 Nov 2025
Настройка Apache2 с mod_fcgid и PHP5
Настройка Apache2 с mod_fcgid и PHP5

Версия и автор

Version 1.0
Author: Falko Timme

1 Предварительная заметка

В примерах используется сервер Debian Etch с именем host server1.example.com и IP 192.168.0.100. Для демонстрации создаются два виртуальных хоста: www.example1.com и www.example2.com. Каждый сайт будет запускать PHP-процессы под собственным пользователем (web1, web2) с помощью suExec.

Важно: я не даю гарантий, что инструкция будет работать в вашей среде без адаптации.

2 Установка Apache2, mod_fcgid и PHP5

Установите пакеты командой:

apt-get install apache2 libapache2-mod-fcgid php5-cgi

Если Apache уже использовал PHP как модуль, отключите модуль php5:

a2dismod php5

Включите необходимые модули Apache:

a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid

Откройте файл конфигурации PHP для CGI:

vi /etc/php5/cgi/php.ini

В самый конец добавьте строку:

[...]
cgi.fix_pathinfo = 1

Перезагрузите Apache:

/etc/init.d/apache2 force-reload

Важно: cgi.fix_pathinfo = 1 влияет на обработку REQUEST_URI и PATH_INFO. Для приложений с передачей путей через PATH_INFO проверьте совместимость.

3 Создание виртуальных хостов для www.example1.com и www.example2.com

Мы создадим два пользователя и каталоги сайтов, чтобы PHP запускался под их учётными записями.

Создаём группы и пользователей:

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

Создаём документ-руты и задаём владельцев:

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 в этой сборке Apache настроен с корнем документов /var/www. Проверка:

/usr/lib/apache2/suexec -V

Пример вывода:

server1:~# /usr/lib/apache2/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
server1:~#

Поскольку suExec не позволяет запускать бинарники вне AP_DOC_ROOT и не позволяет использовать символические ссылки, мы создаём wrapper-скрипт внутри /var/www, который будет запускать реальный PHP-CGI (/usr/lib/cgi-bin/php). Для каждого сайта нужен отдельный wrapper-скрипт, принадлежащий пользователю сайта.

Создаём каталоги для скриптов:

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/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Объяснение переменных:

  • PHPRC указывает каталог, где лежит php.ini для CGI (здесь /etc/php5/cgi/php.ini).
  • 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

Создаём файлы конфигурации виртуальных хостов Apache:

vi /etc/apache2/sites-available/web1

  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

Активируйте сайт:

a2ensite web1

Создайте второй виртуальный хост по аналогии:

vi /etc/apache2/sites-available/web2

  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

Активируйте сайт:

a2ensite web2

Не забудьте указать корректные пути и правильные user:group в директиве SuexecUserGroup.

Перезагрузите Apache:

/etc/init.d/apache2 reload

Отладка и частые проблемы

  • Проверьте логи Apache и /var/log/apache2/suexec.log при ошибках прав или запусков.
  • Ошибка 500 при обращении к .php обычно связана с правами на wrapper-скрипт или его каталог: suExec требует, чтобы все каталоги и скрипты принадлежали указанному пользователю и не были групповыми/публично записываемыми.
  • Если PHP не обрабатывает PATH_INFO, убедитесь, что PHP_Fix_Pathinfo_Enable 1 и cgi.fix_pathinfo = 1 установлены.

Альтернативные подходы

  • PHP-FPM + модуль proxy_fcgi (рекомендуется для современных систем): PHP-FPM запускается как отдельный демон под нужными пользователями или пулами, а Apache пересылает запросы через модуль proxy_fcgi.
  • Оставить модуль mod_php (libapache2-mod-php5) — проще, но все скрипты будут выполняться от пользователя Apache (www-data), что хуже для безопасности многопользовательских хостов.

Когда стоит выбирать альтернативы:

  • Для высокой плотности сайтов и лучшей изоляции процесса используйте PHP-FPM.
  • Для упрощённой администрирования на старых проектах можно временно оставить мод_php, но это небезопасно для хостинга нескольких пользователей.

Чек‑лист перед запуском (для администратора)

  • Установлены apache2, libapache2-mod-fcgid, php5-cgi.
  • Модуль php5 отключён (если он был активен).
  • Включены модули: rewrite, suexec, include, fcgid.
  • В php.ini для CGI: cgi.fix_pathinfo = 1.
  • Созданы пользователи и каталоги сайтов с корректными владельцами.
  • Wrapper-скрипты находятся в /var/www и принадлежат соответствующим пользователям.
  • Виртуальные хосты настроены и активированы; перезагружен Apache.

Роль‑ориентированные задачи

  • Системный администратор: проверяет права, регистрирует сайты в DNS, мониторит логи, настраивает бэкапы.
  • Владелец сайта/разработчик: кладёт код в /var/www/webX/web/, проверяет права на файлы (не давать 777), тестирует на dev-окружении.

Критерии приёмки

  • При обращении к http://www.example1.com/index.php страница отрабатывает и PHP-скрипты выполняются от пользователя web1.
  • Логи /var/log/apache2/*.log и /var/log/apache2/suexec.log не содержат критических ошибок при обычном запросе.
  • В случае ошибок 500 — причина выяснена и исправлена (права, owner, исполняемые бит).

Тестовые сценарии

  1. Зайдите на /info.php с содержимым — подтвердите, что пользователь процесса соответствует web1/web2.
  2. Создайте файл с правами 644 и владельцем web1 — убедитесь, что сайт читает файл.
  3. Попытайтесь выполнить upload-файл; проверьте, что загрузка попадает в каталог с правильным владельцем и правами.

Безопасность и рекомендации

  • Не давать каталогам под /var/www права на запись группе или всему миру.
  • Логи suExec помогают понять проблемы с правами, храните их в защищённом месте.
  • Для публичных сайтов рассмотрите применение дополнительного уровня изоляции (chroot, контейнеры, LXC/Docker).
  • Обновляйте ОС и пакеты — Debian Etch давно не поддерживается; планируйте миграцию на поддерживаемую версию.

Совместимость и миграция

  • Debian Etch очень старый релиз. На современных Debian (например, Jessie, Stretch и новее) рекомендуется использовать PHP-FPM и systemd-юниты.
  • При миграции к PHP-FPM нужно будет переписать конфигурацию виртуальных хостов: вместо FCGIWrapper используйте ProxyPassMatch или SetHandler с unix-сокетом/портом.

Короткая методология внедрения (mini‑SOP)

  1. Подготовка: резервное копирование конфигураций и сайтов.
  2. Установка пакетов и отключение модулей модулей, конфликтующих с fcgid.
  3. Создание пользователей и каталогов, написание wrapper-скриптов и настройка прав.
  4. Создание и активация виртуальных хостов.
  5. Проверка работы на тестовом домене и анализ логов.
  6. Перевод в production и мониторинг.

1‑строчный глоссарий

  • mod_fcgid — модуль Apache для запуска FastCGI-процессов.
  • suExec — механизм Apache для запуска CGI под учётной записью владельца сайта.
  • FCGIWrapper — директива, указывающая wrapper-скрипт для обработки .php через FastCGI.

Сводка

Настройка Apache2 с mod_fcgid и PHP5 на Debian Etch даёт возможность запускать PHP‑скрипты под владельцами сайтов (улучшенная безопасность для мультихостинга). Процесс включает установку пакетов, отключение модульного PHP, создание wrapper-скриптов внутри /var/www (из‑за ограничений suExec), настройку виртуальных хостов и тестирование. Для современных систем рассмотрите переход на PHP‑FPM и proxy_fcgi.

Важно сохранить резервные копии и протестировать изменения в тестовой среде перед выкатом в продакшен.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Автоматическая очистка Linux с Cruftbuster
Linux утилиты

Автоматическая очистка Linux с Cruftbuster

Master PDF Editor на Linux: создание и редактирование
PDF редакторы

Master PDF Editor на Linux: создание и редактирование

Многокамерная трансляция бесплатно
Стриминг

Многокамерная трансляция бесплатно

Открыть Configuration Manager (SCCM) в Windows 11
Системное администрирование

Открыть Configuration Manager (SCCM) в Windows 11

Внешнее Featured Image по URL в WordPress
WordPress

Внешнее Featured Image по URL в WordPress

Отключить автозапуск USB в Windows XP и выше
Безопасность

Отключить автозапуск USB в Windows XP и выше