Макс

Родной город: Омск

Фото галерея: смотреть

Контакты: написать

О себе:

Интересы:

- программирование

- интернет

- психология

- менеджмент

- автоматизация

Погляди
Голосование

Нравиться ли вам блог

  Да
  Нет
  Я тут случайно

 

ГлавнаяКарта сайтаПечать страницы

Настройка FastCGI для Apache PHP (CentOS, Red Hat)

Решил использовать связку FastCGI и Апач(пока отказаться от него не могу), есть луше связка(FastCGI+Nginx), но про нее статья будет позже. Данная связка даст нам высокую производительность нагруженных серверов, гипкость в настройках php.ini/права доступа для каждого пользователя, безопасность SuExec.


1. Проверка настроек

И так для начала проверим настройки Apache, откомпилирован ли он с поддержкой suexec:

#apachectl -V
Server version: Apache/2.2.3
Server built: Aug 31 2011 20:22:40
Server's Module Magic Number: 20051115:3
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"


Нас интересует следующая строка:-D SUEXEC_BIN="/usr/sbin/suexec"

Она говорит нам о том, что suexec поддерживается. Теперь выясним его параметры:

# 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"

ЕслиAP_DOC_ROOT Вас не устраивает, бывает что нужно например /home тогда дуемсюда и настраиваем SuExec.Итак из этого вывода мы узнали, что suexec работает начиная с директории /var/www.

2. Установка FastCGI

Продолжив дальнейшие поиски я нашел очень хорошую статью о том как откомпилировать FastCGI для CentOS тут. Дальнейшие мои действия были выполнены по этой статье. Следую выше указанной инструкции начинаем процесс установки FastCGI:

# yum install libtool httpd-devel apr-devel aprmod_fcgi



Процесс установки завершен. Теперь самое время перейти к настройкам.

3. Настройки.

Итак наша задача минимизировать время простоя Web-сервера. Но нам необходимо сделать очень очень много:
– перемонтировать домашнюю директорию;
– изменить метод запуска PHP;
– изменить настройки виртуальных хостов.

Нам известно, что настройки Apache вступают в сило только после его перезагрузки. Логично сделать все его настройки до того, как мы остановим сервер для перемонтирования. Перво-на-перво включим поддержку FastCGI:

LoadModule fastcgi_module modules/mod_fcgi.so добавьте или раскоментируйте запись в файле настроек апача или/etc/httpd/conf.d/mod_fcgi.conf


Теперь отключим PHP(не обязательно):

# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.disable


Создаем скрипт который будет выполнять через CGI наши php файлы. Разместим скрипт в директории cgi-bin под названием php.fcgi, которую создадим внутри директорий сайта. Содержание скрипта следующее:


#!/bin/bash
PHPRC=$PWD/../etc/php5
export PHPRC
umask 022
export PHP_FCGI_CHILDREN
SCRIPT_FILENAME=$PATH_TRANSLATED
export SCRIPT_FILENAME
exec /usr/bin/php-cgi


Изменим владельца и права доступа к этому файлу:

# chown user:users php.fcgi
# chmod +x php.fcgi


Отключаем модуль PHP в Apache:

# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.disable


Если помните то в прошлой статья я описывал как прикуртить виртуальный хостинг к CentOC’у Apache в отдельной директории. Теперь мы редактируем эти файлы добавляя к ним возможность выполнения через FastCGI со сменой пользователя suexec’ом:



ServerName XXXX.ru
ServerAlias *.XXXX.ru
DocumentRoot /var/www/home/XXXX/public_html
ServerAdmin I@get.it
SuexecUserGroup XXXX users
ScriptAlias /cgi-bin/ "/var/www/home/XXXX/cgi-bin/"
ErrorLog "/var/www/home/XXXX/error.log"
CustomLog "/var/www/home/XXXX/access.log" common

Options -Indexes FollowSymLinks +ExecCGI
AllowOverride All
AddHandler php5-fastcgi .php
Action php5-fastcgi /cgi-bin/php.fcgi
Order allow,deny
Allow from all


AllowOverride None
Options None
Order allow,deny
Allow from all




Теперь проверим на ошибки наши изменения:

# service httpd configtest
Syntax OK


Если нам вернется что-либо отличное от ОК, исправляем и проверяем снова.

Вот конфиг более детальный, вдруг понадобиться.


LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so

После чего в конец конфига апача дописываем такое:

# конфиг модуля
<IfModule mod_fastcgi.c>
# конфиг модуля.
# полный список опций - доступен по следующему адресу
# http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
# тут приведены лишь те, которые я заюзал
# -singleThreshold - Целое число, мжду 0 и 100, используеммое
# для определения, может ли быть завершён последний экземпляр
# приложения FastCGI. Если менеджер процессов, вычисляет, что
# фактор загрузки для приложения меньше заданного порога, то
# последний экземпляр завершается. Для работы приложения в
# режиме "idle" долгого времени, вы должны задать значение
# ближе к 1, однако, если более приоритетна память, или время
# CPU, более применимо значение 100. Значение 0 предотвращает
# завершение последнего экземпляра приложения; это - значение
# по умолчанию, и менять его не рекомендуется (особенно, если
# установлена -appConnTimeout)
# -minProcesses - минимальное общее число динамических приложений
# FastCGI, разрешённых к работе в любое время, без убивания
# менеджером процессов.
# -restart - заставляет менеджер процессов повторно запускать
# приложения в случае сбоя (подобно статическим приложениям)
# -idle-timeout - число секунд бездействия приложения FastCGI,
# до прерывания запроса и логгирования события. Таймер бездейстаия
# применяется лишь к долго висящим соединениям приложений FastCGI.
# Если запрос будет находиться в очереди к приложению, но
# приложение не отвечает (путём записи и сброса) в течение этого
# периода, то запрос будет прерван. Если связь с приложением
# успешно завершается, но не завершается с клиентом, (ответ -
# buffered), таймаут не применяется.
# -killInterval - Определяет, как часто менеджером процессов
# применяется политика завершения динамических экземпляров
# приложения. Меньшее число приводит к более агессивной политике,
# большее - к менее агрессивной.
# -autoUpdate - вызывает проверку модулем mod_fastcgi проверку
# времени модификации приложения на диске до обработки каждого
# запроса. Если приложение на диске изменилось, уведомляется
# менеджер процессов и все работающие экземпляры программы
# уничтожаются. Вообще, предпочтительно, чтобы этот тип
# функциональности был встроен в приложение (например, каждый
# 100-й запрос проверяет, есть ли новая версия на диске, и выходит
# если это так). Могут быть ошибки, если эта опция применяется с
# опцией -restart
# -pass-header - имя заголовка запроса HTTP для передачи среде
# request. Эта опция делает доступным содержимое заголовков,
# которые обычно недоступны (например, Authorization) в окружении GCI.
FastCgiConfig -singleThreshold 30 -minProcesses 2 -restart
-idle-timeout 400 -killInterval 200 -autoUpdate
-pass-header HTTP_AUTHORIZATION
# используетс ядля включения враппера
FastCgiWrapper /usr/local/sbin/suexec
# директория где хранятся сокеты
FastCgiIpcDir /var/run/fastcgi
# предпринимаемые для такого типа файлов действия
Action application/x-httpd-fastphp /php-fcgi/php.sh
Action application/x-httpd-php /php-fcgi/php.sh
# добавляем типы файлов - у меня нету типа .php4 .php5 и т.д.
# если у вас есть - добавльте через пробелы в этой строке
AddType application/x-httpd-fastphp .php
# Обработка файлов апачем
<Location /php-fcgi/>
Options ExecCGI FollowSymLinks
SetHandler fastcgi-script
</Location>
</IfModule>