Установка Apache mpm-itk на Unix/Linux

Установка Apache mpm-itk на Unix/Linux

mpm-itk — это MPM (multi-processing модуль) для веб сервера Apache что позволяет запускать каждый VirtualHost с собственным идентификатором пользователя и ID группы.

Основной сайт : http://mpm-itk.sesse.net/

Я в своей статье «Установка Apache mpm-itk на Unix/Linux» расскажу как можно установить Apache mpm-itk на Unix/Linux, а конкретно для Debian и CentOS и так же можно скомпилировать под любой другой Unix/Linux ОС.

Подготовка к установке.

Если пользователь и группа не существует, мы можете создать их следующим образом:

# groupadd itk_group
# useradd -s /bin/false -d /home/itk_admin -m -g itk_group itk_admin

Установите ID пользователя и идентификатор группы для виртуального хоста (внутри директивы <IfModule itk.c>). Как правило, это пользователь Apache с группой Apache.

Не забудьте установить правильные права! Для полной и безопасной установки, вам нужно 2 пользователя и 1 группа для каждого виртуального хоста.

Выставляем права на папки:

# chown -R itk_admin:itk_group /home/itk_admin/.*
# chmod o-rwx /home/itk_admin

Выполняем проверку:

# ls -ald /home/itk_admin
drwxr-x--- 20 itk_admin itk_group 4096 June 30 19:38 /home/itk_admin

Если вы хотите установить права рекурсивно, используйте следующие команды:

# find /home/itk_admin -type f -exec chmod 640 {} \;
# find /home/itk_admin -type d -exec chmod 750 {} \;

Первая  команда будет установить все файлы пользователя с пермишенами — RW и для группы — R, второй будет установить все каталоги для пользователя — RWX и группы — RX.

Установка Apache mpm-itk на CentOS/RedHat/Fedora

Чтобы установить mpm-itk,  для начала стоит подключить репозиторий EPEL и после чего уже выполнить команду:

# yum install httpd-itk php

Остановите apache:

# service httpd stop

Для centOS 5-6 нужно выполнить следующие шаги.

Отредактируйте:

# vim /etc/sysconfig/httpd

И добавляем в него:

[...]
HTTPD=/usr/sbin/httpd.itk
[...]

При использовании PHP с mod_php, не забудьте добавить в:

# vim /etc/httpd/conf.d/php.conf

Следующий код:

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

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

# Cause the PHP interpreter to handle files with a .php extension.
AddHandler php5-script .php
AddType text/html .php

# Add index.php to the list of files that will be served as directory
# indexes.
DirectoryIndex index.php

# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#AddType application/x-httpd-php-source .phps

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

Для centOS 7 нужно выполнить следующие шаги.

# vim /etc/httpd/conf.modules.d/00-mpm-itk.conf

LoadModule mpm_itk_module modules/mod_mpm_itk.so

Перезапускаем сервер:

# service httpd restart

И проверяем, загружен ли модуль:

# apachectl -t -D DUMP_MODULES | grep itk

 

Установка Apache mpm-itk на Debian/Ubuntu

apache2-mpm-itk доступен в виде пакета Debian, по этому, установить можно с помощью следующей команды:

# apt-get install apache2-mpm-itk

Настройка, немного ниже.

Установка Apache mpm-itk с исходного кода.

mpm-itk должен быть скомпилирован при установке Apache. Он не может быть загружен как модуль.

Прежде всего, загрузить исходный код Apache, а затем загрузить mpm-itk patch для Apache 2.0 или mpm-itk patch для Apache 2.2 или mpm-itk patch для Apache 2.4:

$ mkdir -p /usr/local/src/apache-itk
$ cd /usr/local/src/apache-itk
$ wget http://www.mirrorservice.org/sites/ftp.apache.org/httpd/httpd-2.2.8.tar.gz
$ wget http://mpm-itk.sesse.net/apache2.2-mpm-itk-20080105-00.patch
$ tar -zxf httpd-2.2.8.tar.gz
$ cd httpd-2.2.8
$ patch -p1 < ../apache2.2-mpm-itk-20080105-00.patch
$ autoconf

Затем, нужно сконфигурировать исходный код Apache с mpm-itk:

$ ./configure --with-mpm=itk

После чего, можно собрать DEB или RPM пакет или скомпилировать его следующими командами:

$ make ; make install

Настройка Apache, создание виртуальных хостов.

Для RedHat/CentOS/Fedora

Установите идентификатор пользователя и идентификатор группы, чтобы ваши виртуальные хосты были похожи что-то типа на:

# vim /etc/httpd/conf.d/mpm-itk.conf

и вставляем:

#Listen 80
Listen 8080

<VirtualHost 97.79.237.17:8080>
 ServerName 97.79.237.17
 DocumentRoot /home/itk_admin
 AssignUserId itk_admin itk_group
<Directory />
 Options FollowSymLinks
 AllowOverride None
</Directory>

<LocationMatch "^/+$">
 Options -Indexes
 ErrorDocument 403 /error/noindex.html
</LocationMatch>

</VirtualHost>

Для Debian/Ubuntu

apache2-mpm-itk — настроем для каждого виртуальный хост, то есть, мы не должны устанавливать какие-либо глобальные параметры  и есть только одна директива которую нужно прописать в виртуальный хосте- AssignUserId, которая принимает два параметра, имя пользователя и группу.

В этом примере я буду использовать виртуальный хост Apache для Debian по умолчанию (вы можете найти его в /etc/apache2/sites-available/default) все файлы и папки сайтов лежат в /var/www (если есть другие виртуальные хости, то настройте их по вашему усмотрению), и я хочу, чтобы этот виртуальный хост запускался от пользователя itk_admin  и его группы itk_group. Я создал пользователя и группу в самом начале данной статьи.

Затем, открываем конфигурационный файл, виртуальный хост, и добавляем следующие строки, например:

# vim /etc/apache2/sites-available/default

И вставляем:

NameVirtualHost *
<VirtualHost *>
ServerAdmin captain@linux-notes.org

 DocumentRoot /home/itk_admin
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/itk_admin/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
RedirectMatch ^/$ /apache2-default/
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

<IfModule mpm_itk_module>
AssignUserId itk_admin itk_group
</IfModule>
</VirtualHost>

AssignUserId принимает два параметра:

  • Первым параметром является идентификатор пользователя (user ID), чтобы запустить Apache для конкретного сайта.
  • Вторым параметром является идентификатор группы (group ID), чтобы запустить Apache для конкретного сайта.

Не забудьте перезапустить Apache после добавления AssignUserId.

Тестирование mpm-itk.

Создаем файл и в нем разместим небольшой код который покажет на очень полезную информацию, для этого выполняем:

# vim /home/itk_admin/test_php_info.php

И вставляем:

<?php
echo "<div align=center>";
echo "=======================================================================<br><br>";
echo "USER: ";
echo `/usr/bin/whoami`;
echo "<br><br>=======================================================================<br><br>";
echo " UID, GID, groups: ";
system (id);
echo "<br><br>=======================================================================<br><br>";
echo `/usr/sbin/httpd.itk -l`;
echo "<br><br>=======================================================================<br><br>";
echo `/usr/sbin/apachectl -v`;
echo "<br><br>=======================================================================<br><br>";
echo "<dr><dr>";
echo "</div>";
phpinfo();
?>

Перезапускаем apache.

CentOS/Fedora/RedHat:

# service httpd restart

Для Debian/Ubuntu:

# /etc/init.d/apache2 restart

Открываем сайт и смотрим от кого запустился:

Установка Apache mpm-itk на Unix/Linux

Все работает должным образом, если нет. То нужно выяснять почему 😉

Тестирование suPHP vs mpm-itk vs mpm-prefork

1. Для mpm-itk, я использовал утилиту  benchmark (ab) и загружал страницу phpinfo() 1,000 раз. Я запускал benchmark 5 раз и средние данные вышли следующими:

  • mpm-itk: average of 37.01 seconds
  • mpm-prefork: average of 6.21 seconds

Другие соображения

suexec и suphp несут ограничения для ваших PHP-приложений, но mpm-itk не несет. Потому mpm_itk  запускает (выполняет) работу и переключает пользователей в нужное место и позволяет запускать PHP код под модулем mod_php. В результате, этот код может свободно использовать любой правообладатель Apache, для которого не доступны PHP/CGI (поддержка аутентификации HTTP).

2. Еще 1 тест:

  • prefork: 2.720166 seconds
  • suphp: 13.621006 seconds
  • itk: 4.263002 seconds

Эти тесты были получены с использованием «AB» с сервером HTTPD. Они представляют время, которое потребовалось, чтобы загрузить первой странице моего блога  200 раз:

# ab -c 1 -n 200 http://www.linux-notes.org/

PreFork является стандартным модулем Apache MPM который работает с mod_php. Это самый быстрый, из изложенных выше, также самый небезопасный.

suPHP решает проблему исполняемых PHP файлов с помощью SUID  и работает под CGI, но крайне медленно.

mpm-itk — модуль для Apache, который также предлагает функцию запуска файлов от различных пользователей, но она основана на PreFork и использует mod_php.Производительность — хуже (в 2x медленнее), чем prefork, но гораздо лучше, чем suPHP.

На этом, статья «Установка Apache mpm-itk на Unix/Linux» подошла к завершению.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.