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

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

• 5 min read • DevOps • Обновлено 19 Nov 2025
Apache2 + mod_fcgid + PHP5 на Debian Squeeze
Apache2 + mod_fcgid + PHP5 на Debian Squeeze

Version 1.0
Автор: Falko Timme
Следите за мной в Twitter

Важно: Debian Squeeze и PHP5 устарели и больше не поддерживаются официально. Для боевых сайтов рекомендуется планировать миграцию на свежие версии ОС и PHP.

1 Предварительное примечание

В примерах используется сервер Debian Squeeze с именем host server1.example.com и IP 192.168.0.100. В учебном примере создаются два виртуальных хоста: www.example1.com и www.example2.com, чтобы показать использование mod_fcgid и suExec.

Я не даю гарантии, что инструкция сработает в вашей среде — проверяйте команды и пути перед запуском.

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

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

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

Если PHP5 уже был установлен как модуль Apache (mod_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 — это обеспечивает корректную обработку PATH_INFO/PATH_TRANSLATED для CGI:

| [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://php.net/cgi.fix-pathinfo cgi.fix_pathinfo=1 [...] |

Откройте конфигурацию модуля fcgid для Apache:

vi /etc/apache2/mods-available/fcgid.conf

Добавьте строку PHP_Fix_Pathinfo_Enable 1. Эта строка не должна находиться внутри секции , иначе Apache выдаст ошибку:

| AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 PHP_Fix_Pathinfo_Enable 1 |

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

/etc/init.d/apache2 restart

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

В этом примере документ-руты будут: /var/www/web1/web и /var/www/web2/web. Владелец первого сайта — user/group web1, второго — web2.

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

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 — suExec обычно ограничивает запуск скриптов каталогом, напечатанным в AP_DOC_ROOT:

/usr/lib/apache2/suexec -V

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

root@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"
root@server1:~#

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

Создадим директории для обёрток:

mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2

Создайте файл /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 аналогично:

| #!/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, создаваемых fcgid для одного запускаемого процесса.

Сделайте скрипты исполняемыми и назначьте владельцев:

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:

vi /etc/apache2/sites-available/web1

Вставьте:

| ServerName www.example1.com ServerAlias example1.com ServerAdmin [email protected] DocumentRoot /var/www/web1/web/ SuexecUserGroup web1 web1 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 и соответствующими путями и владельцем:

vi /etc/apache2/sites-available/web2

| ServerName www.example2.com ServerAlias example2.com ServerAdmin [email protected] DocumentRoot /var/www/web2/web/ SuexecUserGroup web2 web2 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 |

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

a2ensite web2

Наконец, перезагрузите или перечитайте конфигурацию Apache:

/etc/init.d/apache2 reload

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

  • Оба сайта отдают статические страницы из своих DocumentRoot.
  • PHP-скрипты выполняются от имени соответствующего пользователя (web1/web2), а не от www-data.
  • Нет ошибок в логах Apache или в /var/log/apache2/suexec.log при обращении к PHP.

Тесты и контрольные сценарии

  • Разместите в /var/www/web1/web/index.php файл с содержимым и убедитесь, что UID/GID соответствует пользователю web1.
  • Запустите phpinfo() и проверьте настроенный php.ini (PHPRC).
  • Посмотрите логи /var/log/apache2/error.log и /var/log/apache2/suexec.log на предмет ошибок запуска обёрток.

Что делать, если это не сработало

  • Проверьте права и владельцев для /var/www/php-fcgi-scripts/* и самих скриптов.
  • Убедитесь, что suExec допускает выполнение скриптов в /var/www (AP_DOC_ROOT).
  • Включите подробное логирование для fcgid и посмотрите FcgidConnectTimeout ошибки.
  • Проверьте, не мешает ли SELinux/AppArmor (если включены) доступу к исполняемым файлам.

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

  • PHP-FPM + mod_proxy_fcgi: современная и более гибкая архитектура с отдельно запущенными пулом PHP-процессов; проще масштабировать и безопаснее с точки зрения изоляции.
  • mod_php (PHP как модуль Apache): проще в настройке, но все скрипты выполняются от пользователя Apache (www-data), что хуже для хостинга с несколькими пользователями.

Ментальные модели и принятие решений

  • Цель mod_fcgid+suExec: запускать PHP от владельца сайта для безопасности при shared-хостинге.
  • Если вам нужна скорость и масштабируемость — смотрите в сторону php-fpm.
  • Если вы управляете единичным приложением и не разделяете права — mod_php может быть приемлем.

Роль‑ориентированные чеклисты

Для системного администратора:

  • Проверить требования suExec (AP_DOC_ROOT).
  • Настроить владельцев и права доступа.
  • Настроить и протестировать логи.

Для разработчика сайта:

  • Убедиться, что скрипты используют корректные пути (SCRIPT_FILENAME).
  • Проверить совместимость с cgi.fix_pathinfo.

Для провайдера хостинга:

  • Автоматизировать создание wrapper-скриптов и vhost-шаблонов.
  • Следить за безопасностью и изоляцией аккаунтов.

Руководство по устранению неисправностей (runbook)

  1. Запрос к PHP возвращает 500: проверить /var/log/apache2/error.log для подробной причины.
  2. Ошибки suExec: проверить /var/log/apache2/suexec.log — чаще всего проблема с владельцем или местоположением скрипта.
  3. FcgidConnectTimeout: увеличить FcgidConnectTimeout в конфигурации fcgid или оптимизировать время старта PHP.

Безопасность и подсказки по жесткой настройке

  • Держите обёртки (wrappers) с минимальными правами и принадлежащими соответствующему пользователю.
  • Не размещайте исполняемые файлы за пределами AP_DOC_ROOT, если используется suExec.
  • Следите за обновлениями ОС и PHP — Debian Squeeze и PHP5 не получают обновлений безопасности.

Совместимость и рекомендации по миграции

  • Планируйте миграцию на более новые версии Debian (например, stable/oldstable) и современный PHP (php-fpm).
  • При переходе на php-fpm потребуется менять конфигурацию виртуальных хостов на проксирование к сокетам (mod_proxy_fcgi или SetHandler “proxy:unix:/path/to/socket|fcgi://localhost/“).

Краткое резюме

  • mod_fcgid + suExec даёт запуск PHP под владельцем сайта, полезно для shared-хостинга.
  • Требуется создать wrapper-скрипты внутри AP_DOC_ROOT, которые будут запускать /usr/lib/cgi-bin/php.
  • Debian Squeeze и PHP5 устарели; для новых проектов рассмотрите php-fpm и современные релизы ОС.

Ссылки и дальнейшие шаги: проверьте логи, тестируйте phpinfo() и планируйте миграцию на поддерживаемые версии ПО.

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