Это руководство описывает, как Вы можете установить Apache2 с mod_fcgid и PHP5 на Ubuntu 10.10. mod_fcgid является совместимой альтернативой старого mod_fastcgi. Это позволяет выполнять PHP-скрипты с разрешения их владельцев, а не пользователь Apache.
Предварительные замечания
в данном учебном материале я использую Ubuntu server 10.10 с именем хоста server1.example.com и IP-адресом 192.168.1.101. Я создам два Apache виртуальных домена www.example1.com и www.example2.com , чтобы продемонстрировать работу mod_fcgid.
Убедитесь, что Вы вошли в систему с правами root:
|
/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
<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 PHP_Fix_Pathinfo_Enable 1 </IfModule>
Перезапустим Apache2
|
Создаем виртуальные хосты
Создадим виртуальные хосты для www.example1.com и www.example2.com
|
Сейчас я создам два виртуальных доменов, 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. «Скрипт – обертка» затем будет вызывать PHP файлы /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 определяет количество 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-script .php
FCGIWrapper /var/www/php-fcgi-scripts/web1/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>
|
<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 файл (info.php), к примеру для сайта www.example1.com:
Создаем файл:
|
<?php phpinfo(); ?>
И теперь перейдем в браузере по адресу http://www.example1.com/info.php. Если все выполнено правильно, то Вы увидите вот такую страницу и в строке Server API увидите CGI/FastCGI.
Аналогично выполним действия для второго хоста, создаем небольшой php файл (info.php), для сайта www.example2.com:
Создаем файл:
|
<?php phpinfo(); ?>
Переходим в браузере по адресу http://www.example1.com/info.php. Если все выполнено правильно, то Вы увидите вот такую страницу и в строке Server API увидите CGI/FastCGI.