Apache Configuration · 7 min read · Jan 02, 2026
Ejecutando Vhosts Bajo UIDs/GIDs Separados Con Apache2 mpm-peruser En Debian Etch
Ejecutando Vhosts Bajo UIDs/GIDs Separados Con Apache2 mpm-peruser En Debian Etch
Versión 1.0
Autor: Falko Timme
Este artículo explica cómo puedes instalar y configurar apache2-mpm-peruser en un servidor Debian Etch. apache2-mpm-peruser es un MPM (Módulo de Procesamiento Múltiple) para el servidor web Apache 2, muy similar a apache2-mpm-itk, pero más rápido (casi tan rápido como apache2-mpm-prefork). mpm-peruser te permite ejecutar cada uno de tus vhosts bajo un UID y GID separados; en resumen, los scripts y archivos de configuración para un vhost ya no tienen que ser legibles para todos los otros vhosts. Se basa en metuxmpm, una implementación funcional del MPM perchild. El resultado es un entorno de servidor web sano y seguro para tus usuarios, sin soluciones improvisadas como el safe_mode de PHP.
¡Este documento se proporciona sin garantía de ningún tipo! No emito ninguna garantía de que esto funcionará para ti.
1 Nota Preliminar
Por consideraciones de velocidad, echa un vistazo a http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.
Asumo que tienes una instalación de Apache2 funcionando con mod_php en tu servidor Debian Etch, por ejemplo, instalado así:
apt-get install apache2-mpm-prefork libapache2-mod-php5Cuando creas un archivo PHP con la función phpinfo();, por ejemplo, así…
vi /var/www/info.php| |
… y lo llamas en un navegador, verás que prefork está listado en la fila de Módulos Cargados bajo apache2handler:

2 Instalando apache2-mpm-peruser
A diferencia de apache2-mpm-itk, apache2-mpm-peruser no está disponible como un paquete de Debian, por lo tanto, construiré mi propio paquete de Debian (usaré el paquete fuente de apache2-mpm-itk como base para construir mi paquete de Debian apache2-mpm-peruser ya que son muy similares).
Antes de comenzar a construir el paquete, instalo algunos requisitos previos:
apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconfLuego voy a /usr/src y descargo el paquete fuente de 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#A continuación, renombro el directorio apache2-mpm-itk a apache2-mpm-peruser:
mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01Luego voy a ese directorio, descargo el parche mpm-peruser y elimino el parche mpm-itk que ya está en el directorio:
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.patchAhora vamos a la subcarpeta 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#Renombramos todos los archivos que contienen itk en el nombre del archivo:
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.prermA continuación, debemos modificar el archivo changelog, por ejemplo, así:
cat /dev/null > changelog
vi changelog| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Puerto inicial a Apache 2.2. -- Falko Timme <[email protected]> Vie, 15 Ago 2008 14:29:36 +0100 |
¡Asegúrate de que la última línea tenga exactamente un espacio al principio (antes de –) y dos espacios entre la dirección de correo electrónico y la fecha!
Ahora abrimos el archivo de control y reemplazamos todas las ocurrencias de apache2-mpm-itk con apache2-mpm-peruser. Dejo la Descripción tal como está, pero reemplazo ITK con Peruser. En la línea de Conflictos, añado 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: 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: MPM multiusuario para Apache 2.2 El Módulo de Procesamiento Múltiple (MPM) Peruser funciona de manera similar al módulo clásico "prefork" (es decir, sin hilos), excepto que te permite restringir cada vhost individual a un usuario del sistema particular. Esto te permite ejecutar varios sitios web diferentes en un solo servidor sin preocuparte de que puedan leer los archivos de los demás. . Ten en cuenta que este MPM es altamente experimental y no proviene del mismo árbol que los otros MPMs. |
A continuación, modificamos el archivo de reglas:
vi rulesReemplaza
| cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch |
con
| cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch |
Reemplaza
| sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
con
| sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
Reemplaza
| install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/ |
con
| install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ |
Reemplaza
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars |
con
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars |
El archivo completo se ve como sigue:
| #! /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 # solución alternativa para 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 |
Esos son todos los cambios que necesitamos hacer; ahora podemos construir el paquete:
cd ..
dpkg-buildpackageEl paquete estará disponible en el directorio /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#El paquete mpm-peruser que acabamos de construir se llama apache2-mpm-peruser_2.2.3-01-1_i386.deb. Antes de poder instalarlo, debemos desinstalar apache2-mpm-prefork ya que está en conflicto con apache2-mpm-peruser (recuerda el archivo de control):
apt-get remove apache2-mpm-preforkserver1:/usr/src# apt-get remove apache2-mpm-prefork
Leyendo listas de paquetes… Hecho
Construyendo árbol de dependencias… Hecho
Los siguientes paquetes serán REMOVIDOS:
apache2-mpm-prefork libapache2-mod-php5
0 actualizados, 0 recién instalados, 2 para eliminar y 68 no actualizados.
Necesita obtener 0B de archivos.
Después de descomprimir, se liberará espacio en disco de 6115kB.
¿Quieres continuar [Y/n]? <– Y
(Leyendo base de datos … 29620 archivos y directorios actualmente instalados.)
Eliminando libapache2-mod-php5 …
Módulo php5 deshabilitado; ejecuta /etc/init.d/apache2 force-reload para deshabilitar completamente.
Eliminando apache2-mpm-prefork …
Deteniendo el servidor web (apache2)….
server1:/usr/src#
Desafortunadamente, esto también elimina el paquete libapache2-mod-php5, por lo que PHP no funcionará más. Abordaremos eso en un momento.
Ahora podemos instalar el paquete apache2-mpm-peruser:
dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.debAhora, si intentas reinstalar el paquete libapache2-mod-php5, verás que apt insiste en eliminar apache2-mpm-peruser y reinstalar apache2-mpm-prefork, lo cual no es lo que queremos; por lo tanto, abortamos esto:
server1:/usr/src# apt-get install libapache2-mod-php5
Leyendo listas de paquetes… Hecho
Construyendo árbol de dependencias… Hecho
Los siguientes paquetes adicionales se instalarán:
apache2-mpm-prefork
Paquetes sugeridos:
php-pear
Los siguientes paquetes serán REMOVIDOS:
apache2-mpm-peruser
Los siguientes NUEVOS paquetes se instalarán:
apache2-mpm-prefork libapache2-mod-php5
0 actualizados, 2 recién instalados, 1 para eliminar y 61 no actualizados.
Necesita obtener 0B/2833kB de archivos.
Después de descomprimir, se utilizará espacio adicional en disco de 5681kB.
¿Quieres continuar [Y/n]? <– n
Abortar.
server1:/usr/src#
Esto sucede porque cuando se construyó el paquete libapache2-mod-php5, el mantenedor le dijo que depende de apache2-mpm-prefork o apache2-mpm-itk. Esto significa que tendremos que reconstruir el libapache2-mod-php5 desde las fuentes y agregar el paquete apache2-mpm-peruser a las dependencias de ese paquete (puedes hacer esto con cualquier otro paquete también si tienes el mismo problema con otros paquetes). Abordaré eso en un momento.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.