Как настроить Apache2 с mod_fcgid и PHP5 на Debian Lenny
Важно: инструкция рассчитана на Debian Lenny и устаревшие версии PHP/Apache. На современных релизах используйте php-fpm или модуль PHP-FPM в связке с Apache/NGINX.
Предварительная заметка
В примере используется сервер Debian Lenny с именем server1.example.com и IP 192.168.0.100. Для демонстрации создаются два виртуальных хоста: www.example1.com и www.example2.com.
Что делает mod_fcgid и зачем этот подход
mod_fcgid — совместимая альтернатива старому mod_fastcgi. Он позволяет запускать PHP-скрипты с правами владельца файлов (через suExec), а не от пользователя Apache (www-data). Это полезно при хостинге нескольких сайтов с разными владельцами.
Краткое определение: suExec — механизм безопасного запуска CGI-программ от имени конкретного пользователя сайта.
Установка Apache2, mod_fcgid и PHP5
Выполните установку нужных пакетов:
aptitude install apache2 apache2-suexec libapache2-mod-fcgid php5-cgiЕсли PHP5 уже был установлен как модуль Apache, отключите модуль php5:
a2dismod php5Включите необходимые модули Apache:
a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgidОткройте файл настроек CGI-PHP:
vi /etc/php5/cgi/php.iniДобавьте в конец файла строку:
[...]
cgi.fix_pathinfo = 1Перезапустите Apache:
/etc/init.d/apache2 restartСоздание пользователей, директорий и прав
В примере каждому сайту соответствует отдельный системный пользователь и группа:
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Почему нужен скрипт-обёртка для PHP
suExec ограничивает корневую директорию для запуска CGI (AP_DOC_ROOT). В выводе команды видно, что AP_DOC_ROOT равен /var/www, поэтому прямой запуск бинарника /usr/lib/cgi-bin/php невозможен, если он находится вне этого дерева. suExec также не позволяет использовать символьные ссылки. Решение — создать исполняемый скрипт-обёртку внутри /var/www, которая вызовет реальный CGI-исполняемый файл PHP.
План действий:
- создать поддиректории, например /var/www/php-fcgi-scripts/web1 и /var/www/php-fcgi-scripts/web2;
- в каждой создать исполняемый скрипт php-fcgi-starter;
- назначить владельца и права.
Создаём каталоги для обёрток:
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2Создаём скрипты-обёртки (пример для web1):
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И аналогично для web2:
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 (/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Конфигурация виртуальных хостов
Пример конфига для web1 (/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Аналогичный файл создаём для web2, заменив web1 на web2 и пути/пользователя соответствующим образом. Затем активируем web2:
a2ensite web2Перезагрузите конфигурацию Apache:
/etc/init.d/apache2 reloadПроверка и тестирование
- Поместите тестовый файл info.php в каждую директорию сайта:
echo "" > /var/www/web1/web/info.php
echo "" > /var/www/web2/web/info.phpОткройте в браузере http://www.example1.com/info.php и http://www.example2.com/info.php. В секции “Server API” должно быть указано CGI/FastCGI.
Проверьте владельца процесса PHP и прав доступа: процессы должны работать от имени web1/web2.
Тесты приёмки
Критерии приёмки:
- Оба виртуальных хоста отдают PHP-страницы корректно;
- phpinfo() показывает CGI/FastCGI;
- файлы обрабатываются с правами владельца сайта (не www-data);
- логи Apache не содержат ошибок suexec при запуске CGI.
Типичные проблемы и способы их устранения
- Ошибка suExec: проверьте AP_DOC_ROOT (должен охватывать путь к обёртке).
- 403 Forbidden: убедитесь, что каталоги и файлы имеют корректные права и владельцев.
- 500 Internal Server Error при запуске обёртки: проверьте права + Unix line endings и shebang (#!/bin/sh) в скрипте.
- mod_fcgid не обрабатывает .php: проверьте AddHandler/FCGIWrapper внутри секции
.
Альтернативные подходы и когда их использовать
- mod_php (libapache2-mod-php): проще по установке, но все PHP-скрипты выполняются от пользователя Apache — меньше изоляции.
- PHP-FPM + модуль proxy_fcgi или nginx: современное и более масштабируемое решение, рекомендуемое для новых проектов.
- mod_fastcgi: устаревший вариант, заменён модулем mod_fcgid в большинстве дистрибутивов.
Когда mod_fcgid с suExec подходит:
- Требуется запуск скриптов с правами владельца;
- Несложная конфигурация для старых систем.
Когда не подходит:
- Высокая нагрузка и необходимость масштабирования — выбирайте php-fpm;
- Современные дистрибутивы и поддержка безопасности — чаще php-fpm предпочтительнее.
Безопасность и рекомендации по жёсткому ограничению
- Минимизируйте права: директории 755, файлы 644; исполняемые скрипты — 755.
- Не давайте shell-доступа пользователям сайтов (shell /bin/false задаётся в useradd).
- Контролируйте лимиты процессов и памяти для PHP (через PHP_FCGI_CHILDREN и настройки php.ini).
- Регулярно обновляйте пакеты на поддерживаемых релизах ОС и PHP.
Краткий словарь терминов
- suExec — механизм Apache для запуска CGI от имени конкретного пользователя.
- mod_fcgid — модуль Apache для запуска FastCGI-приложений.
- FCGIWrapper — директива, назначающая путь к интерфейсу FastCGI для обработки файлов с заданным расширением.
Чек-лист для администратора перед запуском в прод
- Проверить AP_DOC_ROOT через /usr/lib/apache2/suexec -V
- Создать пользователей и назначить права
- Создать и сделать исполняемыми скрипты-обёртки
- Настроить виртуальные хосты и включить сайты
- Перезагрузить Apache и протестировать phpinfo()
- Настроить бэкапы и мониторинг логов
Совместимость и миграционные заметки
Debian Lenny и PHP5 — устаревшие ПО. Для миграции на современные версии рекомендуются:
- Перенос на Debian 10/11/12 или Ubuntu LTS;
- Переход от mod_fcgid к php-fpm и proxy_fcgi / сокетам unix;
- Тестирование приложений на совместимость с PHP7/8.
Итог
Настройка Apache2 с mod_fcgid и PHP5 на Debian Lenny позволяет запускать PHP-скрипты с правами владельцев сайтов и подходит для окружений с разделением прав между сайтами. Тем не менее, для новых систем и высоких нагрузок стоит рассмотреть php-fpm.
Заметка: замените примеры доменов, пути и учётные записи на реальные значения перед развёртыванием в продакшн.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone