Порой даже элементарная задача приносит кучу новых знаний и требует индивидуального подхода.
На просторах интернетов есть очень много гайдов на тему установки и настройки mod_fastcgi, всё сводится к паре команд и добавлению стандартного конфига. Но не всегда всё обстоит так просто.
Итак, мы имеем связку Apache 2 (бэкенд), nginx (фронтенд), и PHP 5.3.x в режиме mod_php.
Задача: перевести PHP в режим FastCGI
Если кто-то предпочитает собирать пакеты, то приятного ему секаса в этом. Пакет mod_fastcgi для Centos 6 можно найти в репозитории rpmforge.
yum install mod_fastcgi
Далее проверяем чтобы модуль подгружался в /etc/httpd/conf.d/fastcgi.conf
LoadModule fastcgi_module modules/mod_fastcgi.so
Директивой FastCgiIpcDir в этом же конфиге можно задать директорию куда FastCGI будет создавать сокет. Это может быть полезно если у вас возникнут некоторые проблемы с правами (а они ещё как возникнут, особенно если у вас установлен SELinux XD)
Далее, открываем конфиг apache /etc/httpd/conf/httpd.conf и поднимаем директивы User и Group НАД Include conf.d/*.conf!
Это действие решает проблему запуска FastCGI с правильными правами в нужные директории.
Далее редактируем вирутальные хосты. Первым делом проверьте чтобы ваши директивы php_admin_value и php_value были заданы только для модуля mod_php. Да, да, mod_fastcgi не понимает их (:
Пример:
<IfModule mod_php.c>
php_admin_value disable_functions «»
</IfModule>
Задаём директивы для FastCGI:
<IfModule mod_fastcgi.c>
AddHandler php-fastcgi .php
Action php-fastcgi «/cgi-bin/php-wrapper»
</IfModule>
Кстати, путь в action указывается относительно главной DocumentRoot, а не виртуального хоста.
На этом этапе mod_php и mod_fastcgi могут работать одновременно. Если всё в порядке, то можно отключать модуль mod_php. Но как же конфиг PHP?! Если ваш PHP ниже версии 5.3, то единственный выход это обновление. В PHP 5.3 добавлена поддержка секций [HOST=] и [PATH=] (более подробно читаем тут)
Переходим в /etc/php.d/ и создаем конфиг для специальных параметров виртуальных хостов. Пример:
[HOST=site1.ru]
open_basedir = «/var/www/site1.ru/:.»[HOST=site2.ru]
open_basedir = «/var/www/site2.ru/:.»
Значние HOST должно соответствовать $_SERVER[‘SERVER_NAME’]. Учитываются только настройки для первого имени, которое по-умолчанию передается как значение SERVER_NAME.
Например, если у вас в VirtualHost:
server_name site1.ru;
server_name alias.site1.ru;
и в конфиге есть секция [HOST=alias.site1.ru], то зайдя по адресу alias.site1.ru настройки раздела [HOST] в PHP не будут применены.
Надо прописывать первое имя сайта [HOST=site1.ru]. Это удобно, так как у вас один конфиг на все алиасы.