Установка 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
Открываем сайт и смотрим от кого запустился:
Все работает должным образом, если нет. То нужно выяснять почему 😉
Тестирование 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» подошла к завершению.