В этой статье я рассмотрю решения, которые позволяют процессам apache 1.3 выполняться от имени пользователя, которому принадлежит виртуалхост. Архитектура apache 1.3 предполагает только prefork схему, поэтому все описанные ниже решения работают примерно одинаково: в системе запускается некоторое количество процессов apache. При получении запроса он передается одному из бездействующих процессов, процесс определяет на какой виртуалхост пришел запрос и какому пользователю принадлежит этот виртуалхост, после чего процесс suid’ится в пользователя/группу, которым принадлежит виртуалхост. Вся последующая обработка запроса происходит уже от имени пользователя/группы, которым принадлежит виртуалхост.
1. suexec
2. suphp
3. dklab
4. производительность
Описание:
suexec позволяет выполнять CGI скрипты от пользователя, которому принадлежит виртуалхост.
Установка suexec в FreeBSD:
В /etc/make.conf добавить:
WITH_APACHE_SUEXEC=yes
APACHE_SUEXEC_DOCROOT= /home
.endif
В “APACHE_SUEXEC_DOCROOT” следует задавать директорию в которой располагаются пользователи и их DocumentRoot директории.
После этого:
# make install clean
Конфигурирование:
В описание виртуалхоста добавить:
Group example
Преимущества:
+ CGI скрипты работают от имени пользователя.
Недостатки:
- От имени пользователя будут выполняться только CGI скрипты. Скрипты PHP, запущенные под mod_php будут продолжать выполняться от имени веб-сервера.
Описание:
suphp – это DSO-модуль (Dynamic Shared Object) для apache. Позволяет выполнять PHP скрипты от пользователя, которому принадлежит виртуалхост.
Установка suphp в FreeBSD:
# make install clean
Конфигурирование:
в httpd.conf:
AddModule mod_suphp.c
suPHP_Engine on
suPHP_AddHandler x-httpd-php
AddType application/x-httpd-php .php
AddHandler x-httpd-php .php
в описании виртуалхоста:
Преимущества:
+ PHP cкрипты работают от имени пользователя.
Недостатки:
- От имени пользователя будут выполняться только PHP скрипты. CGI скрипты будут продолжать выполняться от имени веб-сервера.
- PHP скрипты запускаются при помощи php-cgi, что лишает возможности использовать mod_php со всеми его преимуществами в плане производительности.
Описание:
dklab apache – это apache 1.3.34 c набором патчей от Дмитрия Котерова. Подробную информацию можно получить по адресу: http://dklab.ru/lib/dklab_apache/
Установка dklab apache в FreeBSD:
Можно скачать порт, распаковать в /usr/ports/www/dklab-apache, затем собрать порт:
# make install clean
Либо можно скачать готовые пакеты и установить при помощи pkg_add:
http://woland.pl.ua/upload/dklab-apache-i386.tbz
http://woland.pl.ua/upload/dklab-apache-amd64.tbz
Конфигурирование:
В описание виртуалхоста добавляем:
Group example
Преимущества:
+ Удобство конфигурирования. Не требуется конфигурировать отдельно suexec и suphp, достаточно директив User/Group в описании виртуалхоста.
Недостатки:
- Процесс выполняется от имени пользователя даже при обработке запроса на статический файл, что негативно сказывается на общей производительности.
Для тестирования производительности использовались 3 файла.
Первый – статический HTML файл с текстом “Hello world!”.
Второй – PHP скрипт:
Третий – CGI скрипт:
print "Content-type: text/html\n\n";
print "Hello world!";
Каждый файл запрашивался 50.000 раз в 50 потоков (“ab -c 50 -n 50000 …”). Засекалось время в секундах за которое полностью выполнится тест.
Время выполнения теста (в сек.):
HTML | PHP | CGI | |
apache 1.3.41 | 5 | 22 | 152 |
apache 1.3.41 с suexec | - | - | 229 |
apache 1.3.41 с suphp | - | 388 | - |
dklab apache | 395 | 293 | 497 |
Стоит отметить, что тест синтетический и показывает не то, чтобы реальные цифры производительности, а скорее сколько времени требуется apache‘у для того, чтобы переключить пользователя от которого работает процесс. К примеру, dklab apache c mod_php на реальной живой системе показал всего лишь ~7-10% разницу в потреблении ресурсов CPU по сравнению с mod_php на обычном apache.