Настройка Apache2 с mod_fcgid и PHP5 на Ubuntu 11.10

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

UbuntuЭто руководство описывает, как можно установить Apache2 с mod_fcgid и PHP5 на Ubuntu 11.10. mod_fcgid является совместимой альтернативой старшего mod_fastcgi. Это позволяет выполнять скрипты с разрешения их владельцев, а не пользователь Apache.

Я не даю никаких гарантий, что это будет работать у Вас!

Предварительные замечания

В этой статье я использую Ubuntu server 11.10 с именем хоста server1.example.com и IP адресом 192.168.0.100. В этом учебнике я создаю 2 виртуальных хоста Apache, www.example1.com и www.example2.com , чтобы продемонстрировать использование mod_fcgid.

Убедитесь, что вы вошли в систему с правами администратора:

  • sudo su

/bin/sh является символической ссылкой на /bin/dash, однако мы должны /bin/bash, а не /bin/dash. Поэтому мы делаем следующим образом:

  • dpkg-reconfigure dash
Install dash as /bin/sh? - No

В дополнение к этому, мы должны отключить AppArmor:

  • /etc/init.d/apparmor stop
  • update-rc.d -f apparmor remove
  • apt-get remove apparmor apparmor-utils

Установка Apache2/mod_fcgi/PHP5

Для того чтобы установить Apache2, mod_fcgid и PHP5, запустите:

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

Если Apache2 уже был установлен с PHP5 в виде модуля Apache, отключить модуль PHP5 сейчас:

  • a2dismod php5

Затем включить следующие модули ...

  • a2enmod rewrite
  • a2enmod suexec
  • a2enmod include
  • a2enmod fcgid

... и откройте /etc/php5/cgi/php.ini:

  • nano /etc/php5/cgi/php.ini

Раскомментируйте строку cgi.fix_pathinfo = 1:

[...]
; 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
[...]

Открыто /etc/apache2/mods-available/fcgid.conf... ... и добавьте строку PHP_Fix_Pathinfo_Enable 1 (эта строка не должна идти в <VirtualHost> раздел, потому что тогда вы получите сообщение об ошибке: PHP_Fix_Pathinfo_Enable cannot occur within <VirtualHost> section): Затем перезагрузите Apache:

  • /etc/init.d/apache2 restart

Создание виртуальных доменов

Cейчас я создам два виртуальных домена, www.example1.com (с корнем /var/www/web1/web ) и www.example2.com (с корнем документа / var/www/web2/web). www.example1.com будет принадлежать пользователю и группе web1 и www.example2.com пользователю и группе 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

Затем мы создаем корневой документ и сделаем их принадлежащими пользователям / группе web1 соответственно 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; корнем Suexec является /var/www, как показано в следующей команде:

  • /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), непосредственно, поскольку он находится за пределами корня Suexec. Suexec не принимает символические ссылки, единственный способ решить проблему заключается в создании сценария для каждого веб-сайта в подкаталоге /var/www; скриптом будет называть бинарный /usr/lib/cgi-bin/php. Скрипт должен принадлежать пользователю и группе каждого веб-сайта, поэтому нам нужен сценарий для каждого веб-сайта. Я собираюсь создать оболочку скриптов в поддиректории /var/www/php-fcgi-scripts, например, /var/www/php-fcgi-scripts/web1 и /var/www/php-fcgi-scripts/web2.

  • mkdir -p /var/www/php-fcgi-scripts/web1
  • mkdir -p /var/www/php-fcgi-scripts/web2
  • nano /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
  • nano /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/ переводится /etc/php5/cgi/php.ini). PHP_FCGI_MAX_REQUESTS максимальное количество запросов до остановки fcgid процесса и его нового запуска. PHP_FCGI_CHILDREN определяет количество children, PHP, который будут запущены.

php-fcgi-starter скрипты должены быть исполняемым, и они (и на их каталогов) должны принадлежать пользователю веб-сайта и группы:

  • 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

Сейчас мы создаем виртуальные хосты Apache для www.example1.com и www.example2.com:

  • nano /etc/apache2/sites-available/web1
<VirtualHost *:80>
  ServerName www.example1.com
  ServerAlias example1.com
  ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  DocumentRoot / var/www/web1/web /

  <IfModule Mod_fcgid.c>
    SuexecUserGroup web1 web1
    <Directory /var/www/web1/web/>
      Options + ExecCGI
      AllowOverride All
      AddHandler fcgid-скрипт. PHP
      FCGIWrapper / var/www/php-fcgi-scripts/web1/php-fcgi-starter. PHP
      Заказ позволяет, отрицает
      Позвольте от всех
    </ Directory>
  </ IfModule>

  # Журнала ошибок / var/log/apache2/error.log
  # CustomLog / var/log/apache2/access.log сочетании
  ServerSignature Off

</ VirtualHost>
  • a2ensite web1
  • nano /etc/apache2/sites-available/web2
<VirtualHost *:80>
  ServerName www.example2.com
  ServerAlias example2.com
  ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  DocumentRoot /var/www/web2/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    <Directory /var/www/web2/web/>
      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
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>
  • a2ensite web2

Убедитесь, что Вы заполните правильные пути (и правильное пользователей и групп в SuexecUserGroup линия). Впоследствии перезагрузить Apache:

  • /etc/init.d/apache2 reload

Теперь мы создадим небольшой тест PHP файлов, например, на www.example1.com сайте ...

  • nano /var/www/web1/web/info.php
<?php
phpinfo();
?>

... и вызовим этот файл в браузере (http://www.example1.com/info.php). Если все пойдет хорошо, то результат должен выглядеть примерно так, и вы увидите CGI / FastCGI в Server API строке:

CGI / FastCGI в Server API строке

Пользовательский php.ini для каждого веб-сайта

Поскольку каждый сайт имеет свой собственный php-fcgi-starter скрипт, можно определить различные php.ini файлы для разных веб-сайтов. Чтобы продемонстрировать это, я буду копировать по умолчанию php.ini (/etc/php5/cgi/php.ini) в /var/www/web2/ каталог и сделаю www.example2.com работающим php.ini в /var/www/web2/ каталогу:

  • cp /etc/php5/cgi/php.ini /var/www/web2/
  • chown web2:web2 /var/www/web2/php.ini

(Теперь вы можете изменить /var/www/web2/php.ini как вам хочется.) Затем мы открываем /var/www/php-fcgi-scripts/web2/php-fcgi-starter ...

  • nano /var/www/php-fcgi-scripts/web2/php-fcgi-starter

... и поместить /var/www/web2/ в PHPRC строки:

#!/bin/sh
PHPRC=/var/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Впоследствии перезагрузите Apache:

  • /etc/init.d/apache2 reload

Создайте новый phpinfo(); файл www.example2.com ...

  • nano /var/www/web2/web/info.php
<?php
phpinfo();
?>

... и вызв его в браузере (http://www.example2.com/info.php). Строка Loaded Configuration File должна теперь показать /var/www/web2/php.ini:

Loaded Configuration File - /var/www/web2/php.ini

Изменение конфигурации одной настройки PHP

Вместо передачи на совершенно новый php.ini файл на веб-сайте, вы можете также изменить одну PHP настройку конфигурации в php-fcgi-starter скрипте (или использовать комбинацию обоих), добавив -й переход на PHP исполняемый файл. Например, если я хочу, чтобы отключился magic_quotes_gpc на веб-сайте www.example2.com, я сделал бы это следующим образом:

  • nano /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 -d magic_quotes_gpc=off

Впоследствии перезагрузите Apache:

  • /etc/init.d/apache2 reload

Затем снова вызовите info.php сценарий в браузерt (http://www.example2.com/info.php) и найдите magic_quotes_gpc строку - сейчас она должна показать Off:

magic_quotes_gpc - Off