From: Alexander Dryantsov <lucif3r@mail.ru.>
Newsgroups: email
Date: Mon, 23 May 2008 17:02:14 +0000 (UTC)
Subject: Настройка работы Plesk 8 через PHP/FastCGI(mod_fcgid) + SuExec
Содержание
Введение
Установка Apache
Настройка Apache
Установка и Настройка PHP
Защищаем директории от чтения
Скрипт для автоматизации настройки
Введение
Данный документ описывает настройку сервера под управлением контрольной
панели Plesk для работы с Apache 2.2.3 с mod_fcgid и PHP 5.2.6 в режиме FastCGI
+ Suhosin Security patch
+ модуль eAccelerator
+ модуль ZendOptimizer
+ модуль ionCube loader
Перед установкой создадим директорию /root/distr, в нее мы будем
складывать все наши исходники:
mkdir /root/distr
Установка Apache
В модуле mod_fcgid существует параметр IPC_COMM_TIMEOUT, отвечающий за
время ожидания отклика от бакенда(PHP).
По дефолту этот таймаут выставлен в 40 секунд, я рекомендую увеличить
этот таймаут, в том случае, если у вас имеются медленные скрипты.
К сожалению в Apache 2 нельзя поменять значение этой директивы для
виртуальных хостов, поэтому необходимо изменить значение в исходнике,в
файле fcgid_conf.c.
cd /root/distr/
wget http://ovh.dl.sourceforge.net/sourceforge/mod-fcgid/mod_fcgid.2.2.tgz
tar -zxf mod_fcgid.2.2.tgz
cd mod_fcgid.2.2
perl -i.bak -pe "s//usr/local/apache2//usr/lib/httpd/" Makefile
perl -i.bak-default -pe "s/DEFAULT_IPC_COMM_TIMEOUT 40/DEFAULT_IPC_COMM_TIMEOUT 300/" /root/distr/mod_fcgid.2.2/fcgid_conf.c
make
cp /etc/httpd/modules/mod_fcgid.so /root/distr/mod_fcgid.so.default
make install
Настройка Apache
Убеждаемся, что /etc/httpd/conf.d/fcgid.conf выглядит следующим образом:
# added by psa-mod-fcgid-configurator
LoadModule fcgid_module /usr/lib/httpd/modules/mod_fcgid.so
Все. Настройка Apache'а закончена. Переходим к настройке PHP
Установка и Настройка PHP
В PHP, собранном в режиме FastCGI существует проблема - процесс может
быть запущен и не убит, т.к. постоянно производит чтение и не обращает
на сигнал SIGTERM, и воспринимается модулем fastcgi как рабочий процесс.
Для того чтобы обойти эту проблему мы внесли изменение в PHP
направленное на принудительное завершение процесса, в том случае, если
он не был убит сигналом TERM.
/* Kill all the processes in our process group */
kill(-pgroup, SIGTERM);
+ if (signal == SIGINT) {
+ sigaction(SIGINT, &old_int, 0);
+ kill(-pgroup, SIGINT);
+ } else {
+ sigaction(SIGTERM, &old_term, 0);
+ kill(-pgroup, SIGTERM);
+ }
+ sigaction(SIGKILL, &old_term, 0);
+ kill(-pgroup, SIGKILL);
#endif
/* We should exit at this point, but MacOSX doesn't seem to */
Применяем патч:
patch -p0 < php-kill.patch
Устанавливаем PHP(можете запустить этот процесс и пойти покурить, либо
выпить чашечку кофе)
Внимание: В процессе пересборки мы дважды остановим сервис Apache'а для
замены файлов, которые могут быть использованы в Apache'е, кроме того,
для совместимости, мы заменим стандартный PHP системы на наш.
К сожалнию конфигурация Plesk'а разрешает читать пользователям
информацию других пользователей, что не очень приятно, поэтому мы
максимально закроем доступ для пользователей нашего сервера.
Т.к. все они находятся в группе psacln, мы запретим действия этой группе:
Первоначально скрипт писался для автоматического добавления
"процессоров" в конфигурацию Apache'а с MPM peruser... Тьфу... В
последсвтие скрипт был переделан.
Скрипт проходит все виртуальные хосты на сервере и проверяет записан ли
наш PHP в конфиги. Данный скрипт необходимо добавить в Action'ы Plesk'а
на создание Physical hosting'а и добавление alias'ов, либо в
/etc/rc.d/init.d/httpd при запуске и reload/condrestart:
#!/bin/sh
# Author: Alexander Dryantsov
####
###
# Prepare
###
function cecho (){
export black='E[0mc'
export boldblack='E[1;0mc'
export red='E[31mc'
export boldred='E[1;31mc'
export green='E[32mc'
export boldgreen='E[1;32mc'
export yellow='E[33mc'
export boldyellow='E[1;33mc'
export blue='E[34mc'
export boldblue='E[1;34mc'
export magenta='E[35mc'
export boldmagenta='E[1;35mc'
export cyan='E[36mc'
export boldcyan='E[1;36mc'
export white='E[37mc'
export boldwhite='E[1;37mc'
local default_msg=""
# Doesn't really need to be a local variable.
message=${1:-$default_msg} # Defaults to default message.
color=${2:-$black} # Defaults to black, if not specified.