Apache Configuration · 7 min read · Jan 02, 2026

Executando Vhosts Sob UIDs/GIDs Separados Com Apache2 mpm-peruser No Debian Etch

Executando Vhosts Sob UIDs/GIDs Separados Com Apache2 mpm-peruser No Debian Etch

Versão 1.0
Autor: Falko Timme

Este artigo explica como você pode instalar e configurar apache2-mpm-peruser em um servidor Debian Etch. apache2-mpm-peruser é um MPM (Módulo de Processamento Múltiplo) para o servidor web Apache 2, muito semelhante ao apache2-mpm-itk, mas mais rápido (quase tão rápido quanto apache2-mpm-prefork). mpm-peruser permite que você execute cada um dos seus vhosts sob um UID e GID separados - em resumo, os scripts e arquivos de configuração de um vhost não precisam mais ser legíveis para todos os outros vhosts. É baseado no metuxmpm, uma implementação funcional do MPM perchild. O resultado é um ambiente de servidor web saudável e seguro para seus usuários, sem gambiarras como o safe_mode do PHP.

Este documento vem sem garantia de qualquer tipo! Eu não dou nenhuma garantia de que isso funcionará para você!

1 Nota Preliminar

Por considerações de velocidade, dê uma olhada em http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.

Estou assumindo que você tem uma instalação funcional do Apache2 com mod_php em seu servidor Debian Etch, por exemplo, instalado assim:

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

Quando você cria um arquivo PHP com a função phpinfo();, por exemplo, assim…

vi /var/www/info.php

| |

… e o chama em um navegador, você verá que prefork está listado na linha Módulos Carregados sob apache2handler:

2 Instalando apache2-mpm-peruser

Ao contrário do apache2-mpm-itk, o apache2-mpm-peruser não está disponível como um pacote Debian, portanto, eu vou construir meu próprio pacote Debian (usarei o pacote fonte do apache2-mpm-itk como base para construir meu pacote Debian apache2-mpm-peruser, já que eles são muito semelhantes).

Antes de começar a construir o pacote, instalo alguns pré-requisitos:

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

Então eu vou para /usr/src e baixo o pacote fonte do 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#

Em seguida, renomeio o diretório apache2-mpm-itk para apache2-mpm-peruser:

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

Então eu vou para esse diretório, baixo o patch mpm-peruser e excluo o patch mpm-itk que já está no diretório:

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

Agora vamos para o subdiretório 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#

Renomeamos todos os arquivos que contêm itk no nome do arquivo:

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

Em seguida, devemos modificar o arquivo changelog, por exemplo, assim:

cat /dev/null > changelog  
vi changelog

| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Porta inicial para Apache 2.2. -- Falko Timme <[email protected]> Fri, 15 Aug 2008 14:29:36 +0100 |

Certifique-se de que a última linha tenha exatamente um espaço no início (antes de –) e dois espaços entre o endereço de e-mail e a data!

Agora abrimos o arquivo de controle e substituímos todas as ocorrências de apache2-mpm-itk por apache2-mpm-peruser. Deixo a Descrição como está, mas substituo ITK por Peruser. Na linha de Conflitos, adiciono 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 multiusuário para Apache 2.2 O Módulo de Processamento Múltiplo (MPM) Peruser funciona de maneira semelhante ao módulo clássico "prefork" (ou seja, sem threads), exceto que permite que você restrinja cada vhost individual a um usuário do sistema específico. Isso permite que você execute vários sites diferentes em um único servidor sem se preocupar que eles possam ler os arquivos uns dos outros. . Observe que este MPM é altamente experimental e não é da mesma árvore que os outros MPMs. |

Em seguida, modificamos o arquivo de regras:

vi rules

Substitua

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

por

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

Substitua

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

por

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

Substitua

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

por

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

Substitua

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

por

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

O arquivo completo fica assim:

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

Essas são todas as mudanças que precisamos fazer - agora podemos construir o pacote:

cd ..  
dpkg-buildpackage

O pacote estará disponível no diretório /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#

O pacote mpm-peruser que acabamos de construir é chamado apache2-mpm-peruser_2.2.3-01-1_i386.deb. Antes de podermos instalá-lo, devemos desinstalar apache2-mpm-prefork, pois ele está em conflito com apache2-mpm-peruser (lembre-se do arquivo de controle):

apt-get remove apache2-mpm-prefork

server1:/usr/src# apt-get remove apache2-mpm-prefork
Lendo listas de pacotes… Pronto
Construindo árvore de dependências… Pronto
Os seguintes pacotes serão REMOVIDOS:
apache2-mpm-prefork libapache2-mod-php5
0 atualizados, 0 novos instalados, 2 a remover e 68 não atualizados.
Necessário obter 0B de arquivos.
Após descompactar, 6115kB de espaço em disco serão liberados.
Você deseja continuar [Y/n]? <– Y
(Lendo banco de dados … 29620 arquivos e diretórios atualmente instalados.)
Removendo libapache2-mod-php5 …
Módulo php5 desativado; execute /etc/init.d/apache2 force-reload para desativar completamente.
Removendo apache2-mpm-prefork …
Parando servidor web (apache2)….
server1:/usr/src#

Infelizmente, isso também remove o pacote libapache2-mod-php5, de modo que o PHP não funcionará mais. Vamos resolver isso em um momento.

Agora podemos instalar o pacote apache2-mpm-peruser:

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

Agora, se você tentar reinstalar o pacote libapache2-mod-php5, verá que o apt insiste em remover apache2-mpm-peruser e reinstalar apache2-mpm-prefork, o que não é o que queremos - portanto, abortamos isso:

server1:/usr/src# apt-get install libapache2-mod-php5
Lendo listas de pacotes… Pronto
Construindo árvore de dependências… Pronto
Os seguintes pacotes adicionais serão instalados:
apache2-mpm-prefork
Pacotes sugeridos:
php-pear
Os seguintes pacotes serão REMOVIDOS:
apache2-mpm-peruser
Os seguintes NOVOS pacotes serão instalados:
apache2-mpm-prefork libapache2-mod-php5
0 atualizados, 2 novos instalados, 1 a remover e 61 não atualizados.
Necessário obter 0B/2833kB de arquivos.
Após descompactar, 5681kB de espaço em disco adicional será utilizado.
Você deseja continuar [Y/n]? <– n
Abortar.
server1:/usr/src#

Isso acontece porque, quando o pacote libapache2-mod-php5 foi construído, o mantenedor disse que ele depende de apache2-mpm-prefork ou apache2-mpm-itk. Isso significa que teremos que reconstruir o libapache2-mod-php5 a partir das fontes e adicionar o pacote apache2-mpm-peruser às dependências desse pacote (você pode fazer isso com qualquer outro pacote também se tiver o mesmo problema com outros pacotes). Eu chegarei a isso em um momento.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.