Apache Konfiguration · 6 min read · Jan 02, 2026
Vhosts unter separaten UIDs/GIDs mit Apache2 mpm-peruser auf Debian Etch ausführen
Vhosts unter separaten UIDs/GIDs mit Apache2 mpm-peruser auf Debian Etch ausführen
Version 1.0
Autor: Falko Timme
Dieser Artikel erklärt, wie Sie apache2-mpm-peruser auf einem Debian Etch-Server installieren und konfigurieren können. apache2-mpm-peruser ist ein MPM (Multi-Processing Module) für den Apache 2-Webserver, sehr ähnlich wie apache2-mpm-itk, aber schneller (fast so schnell wie apache2-mpm-prefork). mpm-peruser ermöglicht es Ihnen, jeden Ihrer vhosts unter einer separaten UID und GID auszuführen - kurz gesagt, die Skripte und Konfigurationsdateien für einen vhost müssen nicht mehr für alle anderen vhosts lesbar sein. Es basiert auf metuxmpm, einer funktionierenden Implementierung des perchild MPM. Das Ergebnis ist eine gesunde und sichere Webserver-Umgebung für Ihre Benutzer, ohne Bastellösungen wie PHPs safe_mode.
Dieses Dokument kommt ohne jegliche Gewährleistung! Ich gebe keine Garantie, dass dies für Sie funktioniert!
1 Vorbemerkung
Aus Geschwindigkeitsgründen werfen Sie einen Blick auf http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.
Ich gehe davon aus, dass Sie eine funktionierende Apache2-Installation mit mod_php auf Ihrem Debian Etch-Server haben, z.B. installiert wie folgt:
apt-get install apache2-mpm-prefork libapache2-mod-php5Wenn Sie eine PHP-Datei mit der Funktion phpinfo(); erstellen, z.B. so…
vi /var/www/info.php| |
… und sie in einem Browser aufrufen, werden Sie sehen, dass prefork in der Zeile Geladene Module unter apache2handler aufgeführt ist:

2 Installation von apache2-mpm-peruser
Im Gegensatz zu apache2-mpm-itk ist apache2-mpm-peruser nicht als Debian-Paket verfügbar, daher werde ich mein eigenes Debian-Paket erstellen (ich werde das Quellpaket apache2-mpm-itk als Grundlage für den Aufbau meines apache2-mpm-peruser Debian-Pakets verwenden, da sie so ähnlich sind).
Bevor ich mit dem Erstellen des Pakets beginne, installiere ich einige Voraussetzungen:
apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconfDann gehe ich nach /usr/src und lade das Quellpaket apache2-mpm-itk herunter:
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#Als nächstes benenne ich das Verzeichnis apache2-mpm-itk in apache2-mpm-peruser um:
mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01Dann gehe ich in dieses Verzeichnis, lade den mpm-peruser-Patch herunter und lösche den bereits im Verzeichnis vorhandenen mpm-itk-Patch:
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.patchJetzt gehen wir in das debian/-Unterverzeichnis:
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#Wir benennen alle Dateien um, die itk im Dateinamen enthalten:
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.prermAls nächstes müssen wir die changelog-Datei ändern, z.B. so:
cat /dev/null > changelog
vi changelog| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Erster Port zu Apache 2.2. -- Falko Timme <[email protected]> Fri, 15 Aug 2008 14:29:36 +0100 |
Stellen Sie sicher, dass die letzte Zeile genau ein Leerzeichen am Anfang hat (vor –) und zwei Leerzeichen zwischen der E-Mail-Adresse und dem Datum!
Jetzt öffnen wir die control-Datei und ersetzen alle Vorkommen von apache2-mpm-itk durch apache2-mpm-peruser. Ich lasse die Beschreibung unverändert, ersetze jedoch ITK durch Peruser. In der Zeile Konflikte füge ich apache2-mpm-itk hinzu:
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: Falko Timme <[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: multiuser MPM für Apache 2.2 Der Peruser Multi-Processing Module (MPM) funktioniert in etwa auf die gleiche Weise wie das klassische "prefork"-Modul (d.h. ohne Threads), außer dass es Ihnen ermöglicht, jeden einzelnen vhost auf einen bestimmten Systembenutzer zu beschränken. Dies ermöglicht es Ihnen, mehrere verschiedene Websites auf einem einzigen Server auszuführen, ohne sich Sorgen machen zu müssen, dass sie die Dateien des anderen lesen können. . Bitte beachten Sie, dass dieses MPM hochgradig experimentell ist und nicht aus dem gleichen Baum wie die anderen MPMs stammt. |
Als nächstes ändern wir die rules-Datei:
vi rulesErsetzen Sie
| cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch |
mit
| cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch |
Ersetzen Sie
| sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
mit
| sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
Ersetzen Sie
| install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/ |
mit
| install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ |
Ersetzen Sie
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars |
mit
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars |
Die vollständige Datei sieht wie folgt aus:
| #! /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 # workaround für 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 |
Das sind alle Änderungen, die wir vornehmen müssen - wir können jetzt das Paket erstellen:
cd ..
dpkg-buildpackageDas Paket wird im Verzeichnis /usr/src verfügbar sein:
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#Das mpm-peruser-Paket, das wir gerade erstellt haben, heißt apache2-mpm-peruser_2.2.3-01-1_i386.deb. Bevor wir es installieren können, müssen wir apache2-mpm-prefork deinstallieren, da es mit apache2-mpm-peruser in Konflikt steht (denken Sie an die control-Datei):
apt-get remove apache2-mpm-preforkserver1:/usr/src# apt-get remove apache2-mpm-prefork
Lese Paketlisten… Fertig
Baue Abhängigkeitsbaum… Fertig
Die folgenden Pakete werden entfernt:
apache2-mpm-prefork libapache2-mod-php5
0 aktualisiert, 0 neu installiert, 2 zu entfernen und 68 nicht aktualisiert.
Möchten Sie fortfahren [Y/n]? <– Y
(Lese Datenbank … 29620 Dateien und Verzeichnisse sind derzeit installiert.)
Entferne libapache2-mod-php5 …
Modul php5 deaktiviert; führen Sie /etc/init.d/apache2 force-reload aus, um es vollständig zu deaktivieren.
Entferne apache2-mpm-prefork …
Webserver anhalten (apache2)….
server1:/usr/src#
Leider entfernt dies auch das Paket libapache2-mod-php5, sodass PHP nicht mehr funktioniert. Das werden wir gleich angehen.
Jetzt können wir das Paket apache2-mpm-peruser installieren:
dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.debJetzt, wenn Sie versuchen, das Paket libapache2-mod-php5 erneut zu installieren, werden Sie sehen, dass apt darauf besteht, apache2-mpm-peruser zu entfernen und apache2-mpm-prefork neu zu installieren, was wir nicht wollen - daher brechen wir dies ab:
server1:/usr/src# apt-get install libapache2-mod-php5
Lese Paketlisten… Fertig
Baue Abhängigkeitsbaum… Fertig
Die folgenden zusätzlichen Pakete werden installiert:
apache2-mpm-prefork
Vorgeschlagene Pakete:
php-pear
Die folgenden Pakete werden entfernt:
apache2-mpm-peruser
Die folgenden neuen Pakete werden installiert:
apache2-mpm-prefork libapache2-mod-php5
0 aktualisiert, 2 neu installiert, 1 zu entfernen und 61 nicht aktualisiert.
Möchten Sie fortfahren [Y/n]? <– n
Abbrechen.
server1:/usr/src#
Dies geschieht, weil der Maintainer beim Erstellen des Pakets libapache2-mod-php5 ihm mitgeteilt hat, dass es entweder von apache2-mpm-prefork oder apache2-mpm-itk abhängt. Das bedeutet, dass wir libapache2-mod-php5 aus den Quellen neu erstellen und das Paket apache2-mpm-peruser zu den Abhängigkeiten dieses Pakets hinzufügen müssen (Sie können dies auch mit jedem anderen Paket tun, wenn Sie dasselbe Problem mit anderen Paketen haben). Ich werde darauf gleich eingehen.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.