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-php5Quando 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 autoconfEntão eu vou para /usr/src e baixo o pacote fonte do 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#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-01Entã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.patchAgora vamos para o subdiretório 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#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.prermEm 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 rulesSubstitua
| 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-buildpackageO pacote estará disponível no diretório /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#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-preforkserver1:/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.debAgora, 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.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.