Это руководство описывает, как можно установить 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.
Убедитесь, что вы вошли в систему с правами администратора:
|
/bin/sh является символической ссылкой на /bin/dash, однако мы должны /bin/bash, а не /bin/dash. Поэтому мы делаем следующим образом:
|
Install dash as /bin/sh? - No
В дополнение к этому, мы должны отключить AppArmor:
|
Установка Apache2/mod_fcgi/PHP5
Для того чтобы установить Apache2, mod_fcgid и PHP5, запустите:
|
Если Apache2 уже был установлен с PHP5 в виде модуля Apache, отключить модуль PHP5 сейчас:
|
Затем включить следующие модули ...
|
... и откройте /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:
|
Создание виртуальных доменов
Cейчас я создам два виртуальных домена, www.example1.com (с корнем /var/www/web1/web ) и www.example2.com (с корнем документа / var/www/web2/web). www.example1.com будет принадлежать пользователю и группе web1 и www.example2.com пользователю и группе web2 . Сначала мы создаем пользователей и групп:
|
Затем мы создаем корневой документ и сделаем их принадлежащими пользователям / группе web1 соответственно web2 :
|
Мы будем запускать PHP, используя Suexec; корнем Suexec является /var/www, как показано в следующей команде:
|
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.
|
#!/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
|
#!/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 скрипты должены быть исполняемым, и они (и на их каталогов) должны принадлежать пользователю веб-сайта и группы:
|
Сейчас мы создаем виртуальные хосты Apache для www.example1.com и www.example2.com:
|
<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>
|
<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>
|
Убедитесь, что Вы заполните правильные пути (и правильное пользователей и групп в SuexecUserGroup линия). Впоследствии перезагрузить Apache:
|
Теперь мы создадим небольшой тест PHP файлов, например, на www.example1.com сайте ...
|
<?php phpinfo(); ?>
... и вызовим этот файл в браузере (http://www.example1.com/info.php). Если все пойдет хорошо, то результат должен выглядеть примерно так, и вы увидите 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/ каталогу:
|
(Теперь вы можете изменить /var/www/web2/php.ini как вам хочется.) Затем мы открываем /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:
|
Создайте новый phpinfo(); файл www.example2.com ...
|
<?php phpinfo(); ?>
... и вызв его в браузере (http://www.example2.com/info.php). Строка Loaded Configuration File должна теперь показать /var/www/web2/php.ini:
Изменение конфигурации одной настройки PHP
Вместо передачи на совершенно новый php.ini файл на веб-сайте, вы можете также изменить одну PHP настройку конфигурации в php-fcgi-starter скрипте (или использовать комбинацию обоих), добавив -й переход на PHP исполняемый файл. Например, если я хочу, чтобы отключился magic_quotes_gpc на веб-сайте www.example2.com, я сделал бы это следующим образом:
|
#!/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:
|
Затем снова вызовите info.php сценарий в браузерt (http://www.example2.com/info.php) и найдите magic_quotes_gpc строку - сейчас она должна показать Off: