Как настроить Apache2 с mod_fcgid и PHP5 на Debian Etch
Версия и автор
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/websuExec в этой сборке 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/phpvi /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, исполняемые бит).
Тестовые сценарии
- Зайдите на /info.php с содержимым — подтвердите, что пользователь процесса соответствует web1/web2.
- Создайте файл с правами 644 и владельцем web1 — убедитесь, что сайт читает файл.
- Попытайтесь выполнить 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)
- Подготовка: резервное копирование конфигураций и сайтов.
- Установка пакетов и отключение модулей модулей, конфликтующих с fcgid.
- Создание пользователей и каталогов, написание wrapper-скриптов и настройка прав.
- Создание и активация виртуальных хостов.
- Проверка работы на тестовом домене и анализ логов.
- Перевод в 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.
Важно сохранить резервные копии и протестировать изменения в тестовой среде перед выкатом в продакшен.
Похожие материалы
Автоматическая очистка Linux с Cruftbuster
Master PDF Editor на Linux: создание и редактирование
Многокамерная трансляция бесплатно
Открыть Configuration Manager (SCCM) в Windows 11