Установка Apache2 с mod_fcgid и PHP5 на OpenSUSE 12.2
Важно: пример использует hostname server1.example.com и IP 192.168.0.100. В примерах vhost используются домены www.example1.com и www.example2.com.
Что вы получите
- Рабочую связку Apache2 + mod_fcgid + PHP5, где PHP-скрипты выполняются от имени владельца сайта.
- Настройку suExec-обёрток (wrapper scripts) для каждого сайта.
- Правильные права и конфигурацию виртуальных хостов.
1. Предварительная заметка
В этом руководстве я использую OpenSUSE 12.2 с hostname server1.example.com и IP 192.168.0.100. Для демонстрации будут созданы два виртуальных хоста: www.example1.com (/srv/www/web1/web) и www.example2.com (/srv/www/web2/web). Первый сайт будет принадлежать пользователю/группе web1, второй — web2.
2. Установка Apache2, mod_fcgid и PHP5
Установите пакеты через zypper:
zypper install apache2 apache2-mod_fcgid php5-fastcgiЕсли Apache уже был установлен с PHP5 как модуль Apache, отключите модуль php5:
a2dismod php5Включите модули suexec и fcgid:
a2enmod suexec
a2enmod fcgidСоздайте системные ссылки для автозапуска Apache и запустите сервис:
systemctl enable apache2.service
systemctl start apache2.serviceОткройте файл конфигурации PHP для fastcgi и включите cgi.fix_pathinfo:
vi /etc/php5/fastcgi/php.iniНайдите и раскомментируйте строку:
[...]
; 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 и добавьте глобальную опцию PHP_Fix_Pathinfo_Enable 1 (строка не должна находиться внутри
vi /etc/apache2/conf.d/mod_fcgid.confДобавьте (вне секции
[...]
PHP_Fix_Pathinfo_Enable 1
Перезапустите Apache:
systemctl restart apache2.service3. Создание пользователей, директорий и vhosts для www.example1.com и www.example2.com
Создадим системные группы и пользователей для каждого сайта и базовые директории:
groupadd web1
groupadd web2
useradd -s /bin/false -d /srv/www/web1 -m -g web1 web1
useradd -s /bin/false -d /srv/www/web2 -m -g web2 web2
chmod 755 /srv/www/web1
chmod 755 /srv/www/web2Создаём document root’ы и назначаем владельцев:
mkdir -p /srv/www/web1/web
chown web1:web1 /srv/www/web1/web
mkdir -p /srv/www/web2/web
chown web2:web2 /srv/www/web2/webПоскольку мы будем использовать suExec, нужно проверить корневую директорию, разрешённую suExec (AP_DOC_ROOT):
/usr/sbin/suexec2 -VПример вывода:
server1:~ # /usr/sbin/suexec2 -V
-D AP_DOC_ROOT="/srv/www"
-D AP_GID_MIN=96
-D AP_HTTPD_USER="wwwrun"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=96
-D AP_USERDIR_SUFFIX="public_html"
server1:~ #Важно: бинарник /usr/bin/php-cgi находится вне корня suExec (/srv/www), поэтому suExec не позволит напрямую запускать этот бинарник. Решение — создать wrapper-скрипт в поддиректории /srv/www, который будет вызывать /usr/bin/php-cgi. Такой скрипт должен принадлежать пользователю сайта.
Создадим директории для обёрток:
mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2Создаём скрипт-стартер для web1:
vi /srv/www/php-fcgi-scripts/web1/php-fcgi-starterВставьте в скрипт:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiИ для web2:
vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starterС содержимым аналогичным первому:
#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgiКоротко о переменных:
- PHPRC — директория, где лежит php.ini для fastcgi (/etc/php5/fastcgi/php.ini).
- PHP_FCGI_MAX_REQUESTS — максимальное число запросов до перезапуска процесса.
- PHP_FCGI_CHILDREN — число процессов-детей PHP, запускаемых fcgid (при fork-режиме).
Сделайте скрипты исполняемыми и назначьте владельцев:
chmod 755 /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /srv/www/php-fcgi-scripts/web1
chown -R web2:web2 /srv/www/php-fcgi-scripts/web2Теперь создадим конфигурационные файлы виртуальных хостов. Для www.example1.com:
vi /etc/apache2/vhosts.d/www.example1.com.confВставьте:
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin [email protected]
DocumentRoot /srv/www/web1/web/
SuexecUserGroup web1 web1
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /srv/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
Для www.example2.com аналогично:
vi /etc/apache2/vhosts.d/www.example2.com.confВставьте:
ServerName www.example2.com
ServerAlias example2.com
ServerAdmin [email protected]
DocumentRoot /srv/www/web2/web/
SuexecUserGroup web2 web2
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /srv/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
Убедитесь, что пути и имена пользователей совпадают с вашими.
Откройте /etc/apache2/httpd.conf и перед Include /etc/apache2/vhosts.d/*.conf добавьте NameVirtualHost :
vi /etc/apache2/httpd.confНайдите раздел с виртуальными хостами и добавьте:
[...]
### Virtual server configuration ############################################
NameVirtualHost *:80
Include /etc/apache2/vhosts.d/*.conf
[...]Перед перезапуском Apache изменим режим файлу suexec, иначе при старте появится предупреждение о необходимости SUEXEC wrapper:
chmod 4755 /usr/sbin/suexec2Перезапустите Apache:
systemctl restart apache2.serviceЕсли всё настроено верно, каждый сайт будет запускать PHP-процессы от имени своего пользователя (web1 или web2).
Валидация и тестирование
- Создайте простой phpinfo() в каждом сайте: /srv/www/web1/web/info.php и /srv/www/web2/web/info.php с содержимым .
- Проверьте через браузер, что страница отображается и переменная USER/UID соответствует владельцу сайта.
- Посмотрите логи /var/log/apache2/error.log и /var/log/apache2/suexec.log при ошибках.
Частые ошибки и когда это не сработает
- suExec запрещает запуск бинарников вне AP_DOC_ROOT: убедитесь, что обёртки находятся внутри /srv/www.
- Неправильные права на скрипты или директории приведут к отказу suExec (проверяйте chmod и chown).
- Если забыли отключить mod_php (как модуль Apache), конфликты с fcgid возможны — убедитесь, что a2dismod php5 выполнен.
- Если PHP не запускается или возвращает 500, проверьте вывод suexec.log и логи vhost’а.
Альтернативные подходы
- PHP-FPM + mod_proxy_fcgi: современный и часто предпочтительный подход — запускать php-fpm и подключать через proxy_fcgi. Он проще для управления процессами и масштабирования.
- mod_fastcgi: устаревший вариант, mod_fcgid — совместимая альтернатива.
- Запуск PHP в контейнерах (Docker) — даёт изоляцию и переносимость.
Модель принятия решения (heuristic)
- Нужен запуск PHP под владельцем сайта → используйте suExec + mod_fcgid и обёртки.
- Нужна лучшая производительность и современное управление процессами → используйте PHP-FPM.
Рекомендации по безопасности
- Ограничьте доступ к директориям сайта (chmod 755 для директорий, 644 для файлов, кроме исполняемых скриптов).
- Не давайте права shell (login) системным пользователям сайтов — используйте /bin/false.
- Логи suExec и Apache держите ротационными и с ограниченным доступом.
- Отключайте неиспользуемые модули Apache.
Чек-лист для системного администратора
- Установлены apache2, apache2-mod_fcgid, php5-fastcgi
- Отключён модуль php5 (если он был включён)
- Включены модули suexec и fcgid
- cgi.fix_pathinfo=1 в /etc/php5/fastcgi/php.ini
- PHP_Fix_Pathinfo_Enable 1 в /etc/apache2/conf.d/mod_fcgid.conf (вне
) - Созданы пользователи/группы и директории сайтов
- Созданы и защищены php-fcgi-starter скрипты внутри /srv/www
- Правильно настроены файлы vhosts с FCGIWrapper и SuexecUserGroup
- NameVirtualHost *:80 добавлен в /etc/apache2/httpd.conf
- chmod 4755 /usr/sbin/suexec2
- Apache перезапущен и страницы phpinfo корректно отображаются
Краткий глоссарий (1 строка)
- suExec — механизм Apache для исполнения CGI/SCGI/FCGI программ от имени конкретного пользователя.
- mod_fcgid — модуль Apache для выполнения FastCGI-приложений.
- php-cgi — CGI-исполняемый бинарник PHP для запуска в окружениях FastCGI.
Итог
Настройка Apache2 + mod_fcgid + PHP5 на OpenSUSE 12.2 требует: установки соответствующих пакетов, отключения mod_php, включения suexec и fcgid, правки php.ini и mod_fcgid.conf, создания wrapper-скриптов внутри корня suExec и корректной настройки виртуальных хостов. После выполнения шагов PHP будет выполняться под владельцем сайта, что повышает изоляцию приложений.
Важно: рассмотрите PHP-FPM как альтернативу для новых развёртываний — он проще в управлении и масштабировании.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента