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

Установка Apache2 с mod_fcgid и PHP5 на OpenSUSE 12.2

• 5 min read • Серверы • Обновлено 22 Nov 2025
Apache2 + mod_fcgid + PHP5 на OpenSUSE 12.2
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.service

3. Создание пользователей, директорий и 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).

Валидация и тестирование

  1. Создайте простой phpinfo() в каждом сайте: /srv/www/web1/web/info.php и /srv/www/web2/web/info.php с содержимым .
  2. Проверьте через браузер, что страница отображается и переменная USER/UID соответствует владельцу сайта.
  3. Посмотрите логи /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 как альтернативу для новых развёртываний — он проще в управлении и масштабировании.

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