서버 설정 · 6 min read · Jan 02, 2026

Debian Etch에서 Apache2 mpm-peruser로 별도의 UID/GID로 Vhosts 실행하기

Debian Etch에서 Apache2 mpm-peruser로 별도의 UID/GID로 Vhosts 실행하기

버전 1.0
저자: Falko Timme

이 문서는 Debian Etch 서버에 apache2-mpm-peruser를 설치하고 구성하는 방법을 설명합니다. apache2-mpm-peruser는 Apache 2 웹 서버를 위한 MPM(다중 처리 모듈)으로, apache2-mpm-itk와 매우 유사하지만 더 빠릅니다(거의 apache2-mpm-prefork만큼 빠름). mpm-peruser는 각 vhost를 별도의 UID 및 GID로 실행할 수 있게 해줍니다. 즉, 하나의 vhost에 대한 스크립트 및 구성 파일은 더 이상 다른 모든 vhost에서 읽을 수 있어야 할 필요가 없습니다. 이는 perchild MPM의 작동 구현인 metuxmpm을 기반으로 합니다. 그 결과는 PHP의 safe_mode와 같은 임시방편 없이 사용자에게 안전하고 건전한 웹 서버 환경을 제공합니다.

이 문서는 어떤 종류의 보증 없이 제공됩니다! 이것이 귀하에게 작동할 것이라는 보증을 제공하지 않습니다!

1 사전 참고

속도 고려 사항을 위해 http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/를 참조하십시오.

Debian Etch 서버에 mod_php가 설치된 작동하는 Apache2 설치가 있다고 가정합니다. 예를 들어, 다음과 같이 설치됩니다:

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

phpinfo(); 함수를 사용하여 PHP 파일을 생성하면, 예를 들어 다음과 같이…

vi /var/www/info.php

| |

… 브라우저에서 호출하면, apache2handler 아래의 Loaded Modules 행에 prefork가 나열된 것을 볼 수 있습니다:

2 apache2-mpm-peruser 설치하기

apache2-mpm-itk와 달리, apache2-mpm-peruser는 Debian 패키지로 제공되지 않으므로, 저는 제 자신의 Debian 패키지를 빌드할 것입니다(그들은 매우 유사하므로 apache2-mpm-itk 소스 패키지를 기반으로 사용할 것입니다).

패키지를 빌드하기 전에 몇 가지 필수 요소를 설치합니다:

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

다음으로 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 -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#

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로의 초기 포트. -- Falko Timme <[email protected]> Fri, 15 Aug 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: 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 for Apache 2.2 The Peruser Multi-Processing Module (MPM) works in about the same way as the classical "prefork" module (that is, without threads), except that it allows you to constrain each individual vhost to a particular system user. This allows you to run several different web sites on a single server without worrying that they will be able to read each others' files. . Please note that this MPM is highly experimental, and is not from the same tree as the other MPMs. |

다음으로 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 # workaround for 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 -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#

방금 빌드한 mpm-peruser 패키지는 apache2-mpm-peruser_2.2.3-01-1_i386.deb라는 이름입니다. 설치하기 전에 apache2-mpm-prefork를 제거해야 합니다. apache2-mpm-peruser와 충돌하기 때문입니다(제어 파일을 기억하십시오):

apt-get remove apache2-mpm-prefork

server1:/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 패키지를 해당 패키지의 의존성에 추가해야 함을 의미합니다(다른 패키지에서도 동일한 문제가 발생하면 이 작업을 수행할 수 있습니다). 잠시 후 이 문제를 다루겠습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.