Apache2 + PHP + FastCGI — горячее блюдо

Порой даже элементарная задача приносит кучу новых знаний и требует индивидуального подхода.

На просторах интернетов есть очень много гайдов на тему установки и настройки 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]. Это удобно, так как у вас один конфиг на все алиасы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *