Как настроить 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:
/etc/init.d/apache2 restart3 Создание виртуальных хостов для 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Вставьте:
| |
Активируйте сайт:
a2ensite web1Для web2 повторите с заменой web1 → web2 и соответствующими путями и владельцем:
vi /etc/apache2/sites-available/web2| |
Активируйте сайт 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)
- Запрос к PHP возвращает 500: проверить /var/log/apache2/error.log для подробной причины.
- Ошибки suExec: проверить /var/log/apache2/suexec.log — чаще всего проблема с владельцем или местоположением скрипта.
- 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() и планируйте миграцию на поддерживаемые версии ПО.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента