Установка Apache MPM-ITK на CentOS 5, CentOS 6

Apache MPM-ITK позволяет запускать скрипты, выполняемые вебсервером (например, mod_php, mod_pytjon и т.д.) с правами пользователя-владельца виртуального хоста, а не web-сервера. Чаще всего используется на шаред хостингах. Процесс, работающий от пользователя root, анализирует, какому виртуальному хосту пришел запрос, после чего форкает самого себя с setuid на того пользователя, который указан в настройках данного виртуального хоста.

В начале необходимо подключить репозиторий. Для CentOS 5 пакеты есть в webtatic. В общем, тут есть инструкция как подключить. для CentOS6 - был такой репозиторий "centalt". К сожалению, его владелец, после сбора средств на поддержку проекта, куда-то пропал и не отвечает на предложение сообщества помочь. Правда, пока репозиторий ещё не стал заражённым, появился его клон, сделанный кем-то из добродетелей =). Но... лично у меня пока нет сведений, что он во всех смыслах доверенный. Тем не менее, кому ОЧЕНЬ нужно вот ссылка на копию - repo.x-api.net.

Spoiler: Highlight to view

Чтобы добавить этот репозиторий создайте файл /etc/yum.repos.d/x-api.repo со следующим содержимым:

[x-api]
name=x-api Packages for Enterprise Linux 6 - $basearch
baseurl=http://repo.x-api.net/centos6/$basearch/
enabled=1
gpgcheck=0


P.S. В скором времени (надеюсь), доберусь до создания своей собственной репы, чтобы вот такие "вымирания" не мешали быстро и спокойно работать.

Устанавливаем Apache MPM-ITK или просто обновляем Apache, если он уже есть:
yum install httpd
yum update httpd

Если apache установлен и выполняется, сначала необходимо его остановить!
/etc/init.d/httpd stop

Далее откройте в редакторе /etc/sysconfig/httpd и раскомментируйте строку:
HTTPD=/usr/sbin/httpd.itk

Если мы хотим крутить настройки mpm-itk, нам нужно добавить следующие строчки (если их нет!) в используемый файл конфигурации. Для этого открываем /etc/httpd/conf/httpd.conf и вносим строки:

<IfModule itk.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

Здесь:

  • StartServers - устанавливает число дочерних процессов сервера при запуске;
  • MinSpareServers - задает минимальное число свободных процессов;
  • MaxSpareServers - устанавливает после скольки процессов лишние будут завершаться.;
  • ServerLimit - верхний предел установленного количества процессов;
  • MaxClients - максимальное количество соединений, которые будут обрабатываться одновременно;
  • MaxRequestsPerChild - лимит запросов дочернего процесса. После превышения процесс умирает.

Важно понимать, что нужно быть аккуратным с изменением этим значений. Для большинства сервером не требуется их изменение. Если всё же хотите менять, необходимо четко представлять, что от чего зависит. Описание всех директив есть на официальном сайте apache.

P.S.Если интересно, есть "пример сервера, который обслуживает около 6 миллионов в сутки". Не помню, где нашёл, но автору Спасибо! =)

Spoiler: Highlight to view

Timeout 15
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
 
<IfModule prefork.c>
StartServers      50
MinSpareServers   20
MaxSpareServers   20
ServerLimit     1000
MaxClients      1000
MaxRequestsPerChild  100
</IfModule>

Продолжим.
В последних версиях apache в разных режимах работы (mpm-prefork mpm-itk, mpm-worker...) подключаются разные библиотеки php. Хорошо бы проверить, что php будет работать с нашим режимом "правильно". Для этого идёт и смотрим файл:
nano /etc/httpd/conf.d/php.conf
Один из вариантов того, что там может быть написано:

<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule !prefork.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>

Это значит, что если режим не по умолчанию (mpm-prefork), включать php-zts. А этого нам не нужно. Поэтому мы приводим запись к виду:

<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule itk.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>

Остальные значения нам не интересны.

Запустите Apache:
/etc/init.d/httpd start

После этого apache научится работать от имени пользователя. Проверим, что всё как нужно:

apachectl -t -D DUMP_MODULES | grep mpm
Syntax OK
 mpm_itk_module (static)

Отлично. Теперь нужно добавить запись типа "AssignUserId user group" в настройки виртуального хоста. Например, так:

Spoiler: Highlight to view

<VirtualHost *:80>
  ServerAdmin admin@domain.ru
  ServerName domain.ru
  ServerAlias www.domain.ru
  ErrorLog /var/log/httpd/domain_error.ru
  CustomLog /var/log/httpd/domain_access.ru
  DocumentRoot /var/www/domain.ru
  <Directory /var/www/domain.ru>
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from All
  </Directory>
  AssignUserId user group
</VirtualHost>

Не забудьте проверить правильность конфига:
/etc/init.d/httpd configtest
или
httpd.itk -t
P.S.Заметьте! Не httpd -t. Иначе будет ошибка:
Invalid command 'AssignUserID', perhaps misspelled or defined by a module not included in the server configuration<>

и перечитать его, чтобы настройки вступили в силу:
/etc/init.d/httpd graceful

Комментарии

А где на этой странице установка самого httpd-itk?

Ну... собственно прямо ТУТ =)
Дело в том что в репозиториях centalt(репа умерла) и в webtatic httpd собран УЖЕ с itk. Т.е. нужно просто установить apache (а точнее следовать инструкции).

Если что-то всё же идёт не так, всегда можно посмотреть, что есть в других репозиториях:

# yum search itk
 
httpd-itk.x86_64 : MPM Itk for Apache HTTP Server
itk-devel.i686 : Development headers and libraries for linking against itk
itk-devel.x86_64 : Development headers and libraries for linking against itk
gitk.noarch : Git revision tree visualiser
itk.i686 : Object oriented extensions to Tk
itk.x86_64 : Object oriented extensions to Tk
iwidgets.noarch : A set of useful widgets based on itcl and itk

правильно я понимаю, что после проведенных процедур при вызове htop у процесса httpd владелец должен быть не root, а у каждого виртуального хоста свой? если этого не произошло - что может быть не так?

В целом да - верно. Но не забывайте, что процессы от root пользователя всё равно будут! Должны же быть корневые процессы, которые уже дальше "форкают" пользователя. А сам по себе веб-сервер от root'а не работает. Всё равно это пользователя apache или, например, www-data в debian/ubuntu.

Проверить очень просто. Создайте два файла в корне сайта с разными пользователями и правами 700 - сразу увидите кто читает (должен соответствовать AssignUserID), а кто не имеет доступа.

спасибо за ответ. все получилось

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

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image