В этой статье я рассмотрю решения, которые позволяют процессам apache 1.3 выполняться от имени пользователя, которому принадлежит виртуалхост. Архитектура apache 1.3 предполагает только prefork схему, поэтому все описанные ниже решения работают примерно одинаково: в системе запускается некоторое количество процессов apache. При получении запроса он передается одному из бездействующих процессов, процесс определяет на какой виртуалхост пришел запрос и какому пользователю принадлежит этот виртуалхост, после чего процесс suid’ится в пользователя/группу, которым принадлежит виртуалхост. Вся последующая обработка запроса происходит уже от имени пользователя/группы, которым принадлежит виртуалхост.

1. suexec
2. suphp
3. dklab
4. производительность


1. suexec

Описание:

suexec позволяет выполнять CGI скрипты от пользователя, которому принадлежит виртуалхост.

Установка suexec в FreeBSD:

В /etc/make.conf добавить:

.if ${.CURDIR} == /usr/ports/www/apache13
WITH_APACHE_SUEXEC=yes
APACHE_SUEXEC_DOCROOT= /home
.endif

В “APACHE_SUEXEC_DOCROOT” следует задавать директорию в которой располагаются пользователи и их DocumentRoot директории.

После этого:

# cd /usr/ports/www/apache13
# make install clean

Конфигурирование:

В описание виртуалхоста добавить:

User example
Group example

Преимущества:

+ CGI скрипты работают от имени пользователя.

Недостатки:

- От имени пользователя будут выполняться только CGI скрипты. Скрипты PHP, запущенные под mod_php будут продолжать выполняться от имени веб-сервера.


2. suphp

Описание:

suphp – это DSO-модуль (Dynamic Shared Object) для apache. Позволяет выполнять PHP скрипты от пользователя, которому принадлежит виртуалхост.

Установка suphp в FreeBSD:

# cd /usr/ports/www/suphp
# make install clean

Конфигурирование:

в httpd.conf:

LoadModule suphp_module libexec/apache/mod_suphp.so
AddModule mod_suphp.c
suPHP_Engine on
suPHP_AddHandler x-httpd-php
AddType application/x-httpd-php .php
AddHandler x-httpd-php .php

в описании виртуалхоста:

suPHP_UserGroup example example

Преимущества:

+ PHP cкрипты работают от имени пользователя.

Недостатки:

- От имени пользователя будут выполняться только PHP скрипты. CGI скрипты будут продолжать выполняться от имени веб-сервера.
- PHP скрипты запускаются при помощи php-cgi, что лишает возможности использовать mod_php со всеми его преимуществами в плане производительности.


3. dklab apache

Описание:

dklab apache – это apache 1.3.34 c набором патчей от Дмитрия Котерова. Подробную информацию можно получить по адресу: http://dklab.ru/lib/dklab_apache/

Установка dklab apache в FreeBSD:

Можно скачать порт, распаковать в /usr/ports/www/dklab-apache, затем собрать порт:

# cd /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

Конфигурирование:

В описание виртуалхоста добавляем:

User example
Group example

Преимущества:

+ Удобство конфигурирования. Не требуется конфигурировать отдельно suexec и suphp, достаточно директив User/Group в описании виртуалхоста.

Недостатки:

- Процесс выполняется от имени пользователя даже при обработке запроса на статический файл, что негативно сказывается на общей производительности.


4. производительность

Для тестирования производительности использовались 3 файла.
Первый – статический HTML файл с текстом “Hello world!”.
Второй – PHP скрипт:

<? phpinfo() ?>

Третий – CGI скрипт:

#!/usr/local/bin/perl
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.