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-itkls -lserver1:/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 -lserver1:/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 -lserver1:/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-preforkserver1:/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 в зависимости этого пакета (вы можете сделать это с любым другим пакетом, если у вас такая же проблема с другими пакетами). Я скоро к этому вернусь.
Get new posts in your inbox
No spam. Unsubscribe anytime.