Это руководство описывает, как Вы можете установить Apache2 с mod_fcgid и PHP5 на Fedora 14. mod_fcgid является совместимой альтернативой старшего mod_fastcgi. Это позволяет выполнять PHP -скрипты с разрешения их владельцев, а не пользователя Apache.
Предварительные замечания
В данном учебном материале я использую сервера на Fedora 14 с именем хоста server1.example.com и IP-адрес 192.168.1.101. В этом учебнике я создам два виртуальных домена Apache, www.example1.com и www.example2.com , чтобы продемонстрировать использование mod_fcgid. Прежде чем начать, убедимся, что SELinux отключен. Откроем /etc/selinux/config ...
|
... и проверим SELINUX на отключение :
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
Выполним:
|
... чтобы изменения вступили в силу.
Установка Apache2 / mod_fcgi / PHP5
Мы можем установить Apache2, mod_fcgid, и PHP5 следующим образом:
|
Если Apache2 уже был установлен с PHP5 как модуль Apache, отключим модуль PHP5 сейчас - откроем /etc/httpd/conf.d/php.conf ...
|
... и закомментировать все в этом файле:
# # PHP is an HTML-embedded scripting language which attempts to make it # easy for developers to write dynamically generated webpages. # #<IfModule prefork.c> # LoadModule php5_module modules/libphp5.so #</IfModule> #<IfModule worker.c> # LoadModule php5_module modules/libphp5-zts.so #</IfModule> # # Cause the PHP interpreter to handle files with a .php extension. # #AddHandler php5-script .php #AddType text/html .php # # Add index.php to the list of files that will be served as directory # indexes. # #DirectoryIndex index.php # # Uncomment the following line to allow PHP to pretty-print .phps # files as PHP source code: # #AddType application/x-httpd-php-source .phps
Затем мы создаем авто запуск с системой для Apache и запустим его:
|
Далее мы откроем /etc/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://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=1 [...]
Откроем /etc/httpd/conf.d/fcgid.conf ...
|
... и добавьте строку PHP_Fix_Pathinfo_Enable 1 (эта строка не должна входить в <VirtualHost> раздел, потому что тогда Вы получите сообщение об ошибке: PHP_Fix_Pathinfo_Enable cannot occur within <VirtualHost> section) :
# This is the Apache server configuration file for providing FastCGI support # through mod_fcgid # # Documentation is available at # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html LoadModule fcgid_module modules/mod_fcgid.so # Use FastCGI to process .fcg .fcgi & .fpl scripts AddHandler fcgid-script fcg fcgi fpl # Sane place to put sockets and shared memory file FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm PHP_Fix_Pathinfo_Enable 1
Затем перезагрузите Apache:
|
Создание виртуальных хостов
Сейчас я создам два виртуальных домена, 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@localhost ~]# /usr/sbin/suexec -V -D AP_DOC_ROOT="/var/www" -D AP_GID_MIN=100 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/var/log/httpd/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=500 -D AP_USERDIR_SUFFIX="public_html" [root@localhost ~]#
Поэтому мы не можем вызывать 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/ export PHPRC export PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_CHILDREN=8 exec /usr/bin/php-cgi
|
#!/bin/sh PHPRC=/etc/ export PHPRC export PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_CHILDREN=8 exec /usr/bin/php-cgi
Строка 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:
|
[...] NameVirtualHost *:80 <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.ini для каждого веб-сайта
Так как каждый Web сайт имеет свой собственный php-fcgi-starter скрипт, то можно определить различные php.ini файлы для различных Web сайтов. Чтобы продемонстрировать это, я буду копировать php.ini по умолчанию ( /etc/php.ini ) в /var/www/web2/ каталог и сделаю php.ini выполняемым для www.example2.com из /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/bin/php-cgi
Перезапустим Apache
|
Создадим новый phpinfo(); файл для www.example2.com ...
|
<?php phpinfo(); ?>
Переходим в браузере по адресу http://www.example1.com/info.php. Если все выполнено правильно, то Вы увидите вот такую страницу и в строке Server API увидите CGI/FastCGI.