Apache настройка · 6 min read · Jan 02, 2026

Запуск Vhosts под отдельными UID/GID с Apache2 mpm-peruser на Debian Etch

Запуск Vhosts под отдельными UID/GID с Apache2 mpm-peruser на Debian Etch

Версия 1.0
Автор: Фалько Тимме

Эта статья объясняет, как вы можете установить и настроить apache2-mpm-peruser на сервере Debian Etch. apache2-mpm-peruser — это MPM (модуль многопроцессорной обработки) для веб-сервера Apache 2, очень похожий на apache2-mpm-itk, но быстрее (почти так же быстро, как apache2-mpm-prefork). mpm-peruser позволяет запускать каждый из ваших vhosts под отдельным UID и GID — короче говоря, скрипты и конфигурационные файлы для одного vhost больше не должны быть доступны для чтения для всех остальных vhosts. Он основан на metuxmpm, рабочей реализации MPM perchild. Результат — это разумная и безопасная среда веб-сервера для ваших пользователей, без таких костылей, как safe_mode PHP.

Этот документ предоставляется без каких-либо гарантий! Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Для соображений скорости посмотрите на http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.

Я предполагаю, что у вас есть рабочая установка Apache2 с mod_php на вашем сервере Debian Etch, например, установленная так:

apt-get install apache2-mpm-prefork libapache2-mod-php5

Когда вы создаете PHP-файл с функцией phpinfo();, например, так…

vi /var/www/info.php

| |

… и вызываете его в браузере, вы увидите, что prefork указан в строке Загруженные модули под apache2handler:

2 Установка apache2-mpm-peruser

В отличие от apache2-mpm-itk, apache2-mpm-peruser недоступен в виде пакета Debian, поэтому я создам свой собственный пакет Debian (я буду использовать исходный пакет apache2-mpm-itk в качестве основы для создания своего пакета apache2-mpm-peruser, так как они очень похожи).

Перед тем, как начать сборку пакета, я устанавливаю несколько предварительных условий:

apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconf

Затем я перехожу в /usr/src и загружаю исходный пакет apache2-mpm-itk:

cd /usr/src  
apt-get source apache2-mpm-itk
ls -l
server1:/usr/src# ls -l  
total 52  
drwxr-xr-x 3 root root  4096 2008-08-16 13:29 apache2-mpm-itk-2.2.3-01  
-rw-r--r-- 1 root src  11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz  
-rw-r--r-- 1 root src    664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc  
-rw-r--r-- 1 root src  29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz  
server1:/usr/src#

Далее я переименовываю директорию apache2-mpm-itk в apache2-mpm-peruser:

mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01

Затем я перехожу в эту директорию, загружаю патч mpm-peruser и удаляю патч mpm-itk, который уже находится в директории:

cd apache2-mpm-peruser-2.2.3-01/  
wget http://www.telana.com/files/httpd-2.2.3-peruser-0.3.0.patch  
rm -f apache2.2-mpm-itk.patch

Теперь давайте перейдем в подкаталог debian/:

cd debian/  
ls -l
server1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian# ls -l  
total 64  
-rw-r--r-- 1 root root    10 2008-08-15 16:21 apache2-mpm-itk.dirs  
-rw-r--r-- 1 root root   633 2008-08-15 16:21 apache2-mpm-itk.postinst  
-rw-r--r-- 1 root root   561 2008-08-15 16:21 apache2-mpm-itk.preinst  
-rw-r--r-- 1 root root   342 2008-08-15 16:21 apache2-mpm-itk.prerm  
-rw-r--r-- 1 root root   438 2008-08-15 16:21 changelog  
-rw-r--r-- 1 root root     2 2008-08-15 16:21 compat  
-rw-r--r-- 1 root root   980 2008-08-15 16:21 control  
-rw-r--r-- 1 root root 31777 2008-08-15 16:21 copyright  
-rwxr-xr-x 1 root root  1328 2008-08-15 16:21 rules  
server1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian#

Мы переименовываем все файлы, которые содержат itk в имени файла:

mv apache2-mpm-itk.dirs apache2-mpm-peruser.dirs  
mv apache2-mpm-itk.postinst apache2-mpm-peruser.postinst  
mv apache2-mpm-itk.preinst apache2-mpm-peruser.preinst  
mv apache2-mpm-itk.prerm apache2-mpm-peruser.prerm

Далее мы должны изменить файл changelog, например, так:

cat /dev/null > changelog  
vi changelog

| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Первоначальный порт для Apache 2.2. -- Фалько Тимме <[email protected]> Пт, 15 Авг 2008 14:29:36 +0100 |

Убедитесь, что последняя строка имеет ровно один пробел в начале (перед –) и два пробела между адресом электронной почты и датой!

Теперь мы открываем файл control и заменяем все вхождения apache2-mpm-itk на apache2-mpm-peruser. Я оставляю описание без изменений, но заменяю ITK на Peruser. В строке Conflicts я добавляю apache2-mpm-itk:

vi control

| Source: apache2-mpm-peruser Section: net Priority: extra Build-Depends: apache2-src, apache2-prefork-dev, libcap-dev, autoconf, debhelper (>> 5.0.0) Maintainer: Фалько Тимме <[email protected]> Standards-Version: 3.7.2 Package: apache2-mpm-peruser Provides: apache2-modules, apache2, httpd, httpd-cgi Conflicts: apache2-mpm-prefork, apache2-mpm-itk, apache2-mpm-worker, apache2-mpm-perchild, apache2-mpm-event, apache2-common Depends: ${apache:Depends}, ${shlibs:Depends} Architecture: any Description: многофункциональный MPM для Apache 2.2 Модуль многопроцессорной обработки Peruser (MPM) работает примерно так же, как классический модуль "prefork" (то есть без потоков), за исключением того, что он позволяет вам ограничить каждый отдельный vhost определенному системному пользователю. Это позволяет вам запускать несколько различных веб-сайтов на одном сервере, не беспокоясь о том, что они смогут читать файлы друг друга. . Пожалуйста, обратите внимание, что этот MPM является высокоэкспериментальным и не относится к тому же дереву, что и другие MPM. |

Далее мы изменяем файл rules:

vi rules

Замените

| cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch |

на

| cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch |

Замените

| sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |

на

| sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |

Замените

| install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/ |

на

| install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ |

Замените

| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars |

на

| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars |

Полный файл выглядит следующим образом:

| #! /usr/bin/make -f clean: dh_testdir dh_testroot dh_clean $(RM) -r build-tree/ $(RM) -r apache2.2/ $(RM) build-stamp build: build-stamp build-arch: build-stamp build-stamp: dh_testdir mkdir build-tree/ mkdir apache2.2/ cd apache2.2/ && tar zxf /usr/src/apache2.tar.gz # обходная мера для apache2-src 2.2.3-3 if [ -d apache2.2/apache2 ]; then \ mv apache2.2/apache2/* apache2.2/; \ rmdir apache2.2/apache2/; \ fi cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch cd apache2.2/ && autoconf sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice chmod +x build-tree/config.nice cd build-tree/ && ./config.nice cd build-tree/ && $(MAKE) touch build-stamp binary: binary-arch binary-indep: binary-arch: build-arch dh_testdir dh_testroot dh_installdirs install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ dh_fixperms dh_strip dh_installdocs README dh_installchangelogs dh_installdeb dh_compress dh_shlibdeps echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars dh_gencontrol dh_md5sums dh_builddeb .PHONY: clean build build-arch binary binary-arch binary-indep |

Это все изменения, которые нам нужно внести — теперь мы можем собрать пакет:

cd ..  
dpkg-buildpackage

Пакет будет доступен в директории /usr/src:

cd /usr/src  
ls -l
server1:/usr/src# ls -l  
total 6512  
-rw-r--r-- 1 root src    11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz  
-rw-r--r-- 1 root src      664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc  
-rw-r--r-- 1 root src    29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz  
drwxr-xr-x 5 root root    4096 2008-08-16 13:40 apache2-mpm-peruser-2.2.3-01  
-rw-r--r-- 1 root src      353 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.dsc  
-rw-r--r-- 1 root src      710 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.changes  
-rw-r--r-- 1 root src   165438 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.deb  
-rw-r--r-- 1 root src    50282 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.tar.gz  
-rw-r--r-- 1 root root 6364431 2008-03-22 10:35 apache2.tar.gz  
server1:/usr/src#

Пакет mpm-peruser, который мы только что собрали, называется apache2-mpm-peruser_2.2.3-01-1_i386.deb. Прежде чем мы сможем установить его, мы должны удалить apache2-mpm-prefork, так как он конфликтует с apache2-mpm-peruser (не забудьте о файле control):

apt-get remove apache2-mpm-prefork

server1:/usr/src# apt-get remove apache2-mpm-prefork
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Следующие пакеты будут УДАЛЕНЫ:
apache2-mpm-prefork libapache2-mod-php5
0 обновлено, 0 ново установлено, 2 для удаления и 68 не обновлено.
Необходимо получить 0B архивов.
После распаковки будет освобождено 6115kB дискового пространства.
Вы хотите продолжить [Y/n]? <– Y
(Чтение базы данных … 29620 файлов и директорий в настоящее время установлены.)
Удаление libapache2-mod-php5 …
Модуль php5 отключен; выполните /etc/init.d/apache2 force-reload, чтобы полностью отключить.
Удаление apache2-mpm-prefork …
Остановка веб-сервера (apache2)….
server1:/usr/src#

К сожалению, это также удаляет пакет libapache2-mod-php5, так что PHP больше не будет работать. Мы решим эту проблему через мгновение.

Теперь мы можем установить пакет apache2-mpm-peruser:

dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.deb

Теперь, если вы попробуете переустановить пакет libapache2-mod-php5, вы увидите, что apt настаивает на удалении apache2-mpm-peruser и переустановке apache2-mpm-prefork, что нам не нужно — поэтому мы отменяем это:

server1:/usr/src# apt-get install libapache2-mod-php5
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Следующие дополнительные пакеты будут установлены:
apache2-mpm-prefork
Предлагаемые пакеты:
php-pear
Следующие пакеты будут УДАЛЕНЫ:
apache2-mpm-peruser
Следующие НОВЫЕ пакеты будут установлены:
apache2-mpm-prefork libapache2-mod-php5
0 обновлено, 2 ново установлено, 1 для удаления и 61 не обновлено.
Необходимо получить 0B/2833kB архивов.
После распаковки будет использовано 5681kB дополнительного дискового пространства.
Вы хотите продолжить [Y/n]? <– n
Отмена.
server1:/usr/src#

Это происходит потому, что когда пакет libapache2-mod-php5 был собран, его автор указал, что он зависит от apache2-mpm-prefork или apache2-mpm-itk. Это означает, что нам придется пересобрать libapache2-mod-php5 из исходников и добавить пакет apache2-mpm-peruser в зависимости этого пакета (вы можете сделать это с любым другим пакетом, если у вас такая же проблема с другими пакетами). Я скоро к этому вернусь.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.