Nginx 설치 · 8 min read · Jan 23, 2026

Debian Squeeze에서 소스에서 Nginx 빌드하기

Debian Squeeze에서 소스에서 Nginx 빌드하기

버전 1.0
저자: Michel Käser

이 튜토리얼은 Debian Squeeze에서 소스에서 nginx를 빌드하는 방법을 설명합니다. 추가로, naxsi WAF(웹 애플리케이션 방화벽), SPDY 등과 같은 유용한 3rd-party 모듈도 포함할 것입니다.

마지막에는 완전한 기능을 갖춘 nginx 설치가 완료됩니다.

이것이 여러분에게 작동할 것이라는 보장은 하지 않습니다!

1 요구 사항

이 튜토리얼을 따르려면 다음이 필요합니다:

  • Debian Squeeze를 실행하는 전용 서버
  • 주의 깊게 읽는 데 약 30분의 시간

2 사전 참고 사항

이 튜토리얼에서는 nginx의 개발 버전을 소스 기반으로 사용할 것입니다. 이러한 버전은 불안정할 수 있으며 프로덕션 서버에서 실행하는 것은 권장되지 않습니다.

그러나 SPDY와 같은 일부 모듈은 nginx 버전 1.3.1x 이상이 필요합니다 - 개인적으로는 알려진 취약점이 없기 때문에 nginx의 개발 버전을 사용하는 것이 더 안전하다고 말하고 싶습니다.

3 전제 조건

nginx는 C 프로그래밍 언어로 작성되었으므로 소스 코드를 빌드/컴파일하는 데 도움이 되는 몇 가지 패키지를 설치해야 합니다. 저는 apt 패키지 관리자의 큰 팬이지만, aptitude 등을 사용할 수도 있습니다:

apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzip

이 명령은 gcc 및 make와 같은 모든 필수 패키지를 설치합니다.

4 nginx 소스 다운로드

nginx의 최신 버전은 다음 웹사이트에서 찾을 수 있습니다: nginx.org/en/download.html. 작성 시점의 버전은 1.3.12입니다 - 따라서 우리는 다음을 다운로드할 것입니다:

cd /tmp  
wget http://nginx.org/download/nginx-1.3.12.tar.gz

그리고 소스를 압축 해제합니다:

tar -xzvf nginx-1.3.12.tar.gz

아직 nginx 버전을 빌드하지 않을 것입니다. 먼저 나중에 포함할 몇 가지 3rd-party 모듈을 다운로드할 것입니다.

5 추가 3rd-party 모듈

Apache HTTPd와 달리, nginx는 모듈의 동적 로딩을 지원하지 않습니다(그래서 우리는 저장소에서 설치할 수 있습니다). 제가 읽은 바로는 이것은 가까운 로드맵에 있는 것이 아닙니다.

따라서 우리는 사용자 정의 설치에 포함할 모듈을 미리 결정해야 합니다. 공식 nginx 웹사이트에는 가장 인기 있는 모듈을 나열한 멋진 개요/표가 있습니다: wiki.nginx.org/3rdPartyModules.
모든 사용 가능한 모듈이 포함되어 있지 않으므로 특정 모듈을 찾고 있다면 “nginx redis module github”와 같은 Google 쿼리를 실행하는 것을 추천합니다 - 많은 모듈이 Github에 호스팅되어 있습니다.

5.1 모듈 다운로드

이 튜토리얼에서는 naxsi, SPDY 및 몇 가지 덜 알려진 모듈과 같은 정말 훌륭한 모듈을 다운로드할 것입니다.

headers_more

headers_more부터 시작하겠습니다. 예를 들어 웹 서버 정보를 완전히 숨기기 위해 사용할 수 있습니다. 이는 서버 보안을 강화하는 데 도움이 됩니다:

mkdir /tmp/nginx-modules  
cd /tmp/nginx-modules  
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz  
tar -xzvf v0.19.tar.gz

이 명령은 최신 버전을 다운로드하고 압축을 해제합니다. 새로운 버전이 있는지 확인하기 위해 공식 저장소를 가끔 확인하는 것을 잊지 마세요(다른 모든 모듈에도 해당됩니다).

Cache Purge

이 모듈은 설정에 필요하지 않을 수 있습니다. 그러나 Apache 앞에 nginx가 있고 proxy_pass의 결과를 캐시하는 경우에는 유용할 수 있습니다! 그렇지 않다면 건너뛰세요:

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz  
tar -xzvf 2.0.tar.gz

naxsi

Naxsi는 nginx를 위한 오픈 소스, 고성능, 낮은 규칙 유지 관리 웹 애플리케이션 방화벽 모듈입니다 - 기능적으로 mod_security와 매우 유사합니다. 우리는 고객의 웹 애플리케이션을 보호하기 위해 이를 사용할 것입니다:

wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz  
tar -xzvf naxsi-core-0.49.tgz

SPDY

SPDY는 웹 서버가 스트림 다중화 및 헤더 압축과 같은 SPDY 기능을 활용할 수 있게 해주는 모듈이며 많은 사람들이 이를 새로운 표준으로 이야기하고 있습니다(그것이 되어가는 것 같습니다).

OpenSSL 업그레이드

OpenSSL 1.0.1+가 필요하며, 이는 기본적으로 Squeeze 머신에 없습니다. 이 튜토리얼에서는 Debian의 테스트 저장소를 사용하여 설치할 것입니다. 그러나 소스에서 컴파일하거나 다른 저장소를 확인할 수도 있습니다.

nano /etc/apt/sources.list

다음 줄을 붙여넣습니다:

deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free

이제 서버가 다른 패키지를 테스트 버전으로 업그레이드하지 않도록 해야 합니다. /etc/apt/apt.conf.d/releases 파일을 생성/편집하여 이를 수행할 수 있습니다:

nano /etc/apt/apt.conf.d/releases

그리고 붙여넣습니다:

APT::Default-Release "squeeze";

주의: sources.list에서 stable 저장소를 참조하는 경우 위의 텍스트에서 squeeze를 stable로 교체해야 합니다.

이제 우리는 안전하게 다음을 실행할 수 있습니다:

apt-get update  
apt-get -t testing install openssl

이 명령은 기존 OpenSSL 버전을 업그레이드/설치합니다.

패치 적용

현재 다른 모듈처럼 포함할 방법이 없으며, 대신 nginx 소스 코드에 대한 패치로 제공됩니다. 공식 README는 여기에서 찾을 수 있습니다: nginx.org/patches/spdy/README.txt

cd /tmp/nginx-1.3.12  
wget http://nginx.org/patches/spdy/patch.spdy.txt  
patch -p1 < patch.spdy.txt

이 명령이 모든 마법을 수행할 것입니다.

6 nginx 빌드하기

지금까지 우리는 nginx 소스를 다운로드하고, 추가 3rd-party 모듈을 다운로드하고 SPDY 패치를 적용했습니다. 이제 nginx 설치를 빌드할 시간입니다.

모든 C 애플리케이션과 마찬가지로 - 3단계입니다. 첫 번째 단계를 좀 더 자세히 살펴보겠습니다:

./configure --help

이 명령은 빌드에 대한 모든 사용 가능한 구성 옵션 목록을 보여줍니다. 어떤 모듈을 비활성화하거나 활성화할 수 있는지 등을 확인할 수 있습니다. 제 경우는 다음과 같습니다(단축):

--help                             이 메시지를 출력합니다
 --prefix=PATH                      설치 접두사를 설정합니다
 --sbin-path=PATH                   nginx 바이너리 경로를 설정합니다
 --conf-path=PATH                   nginx.conf 경로를 설정합니다
 --error-log-path=PATH              오류 로그 경로를 설정합니다
 --pid-path=PATH                    nginx.pid 경로를 설정합니다
 --lock-path=PATH                   nginx.lock 경로를 설정합니다
 --user=USER                        작업 프로세스를 위한 비특권 사용자 설정
 --group=GROUP                      작업 프로세스를 위한 비특권 그룹 설정
 --builddir=DIR                     빌드 디렉토리 설정
 --with-rtsig_module                rtsig 모듈 활성화
 --with-select_module               select 모듈 활성화
 --without-select_module            select 모듈 비활성화
 --with-poll_module                 poll 모듈 활성화
 --without-poll_module              poll 모듈 비활성화
 --with-file-aio                    파일 AIO 지원 활성화
 --with-ipv6                        IPv6 지원 활성화
 --with-http_ssl_module             ngx_http_ssl_module 활성화
 [...] 
 --with-http_stub_status_module     ngx_http_stub_status_module 활성화
 --without-http_charset_module      ngx_http_charset_module 비활성화
 [...] 
 --without-http_browser_module      ngx_http_browser_module 비활성화
 --without-http_upstream_ip_hash_module
                                     ngx_http_upstream_ip_hash_module 비활성화
 --without-http_upstream_least_conn_module
                                     ngx_http_upstream_least_conn_module 비활성화
 --without-http_upstream_keepalive_module
                                     ngx_http_upstream_keepalive_module 비활성화
 --with-http_perl_module            ngx_http_perl_module 활성화
 --with-perl_modules_path=PATH      Perl 모듈 경로 설정
 --with-perl=PATH                   perl 바이너리 경로 설정
 --http-log-path=PATH               http 접근 로그 경로 설정
 --http-client-body-temp-path=PATH  http 클라이언트 요청 본문 임시 파일 저장 경로 설정
 --http-proxy-temp-path=PATH        http 프록시 임시 파일 저장 경로 설정
 --http-fastcgi-temp-path=PATH      http fastcgi 임시 파일 저장 경로 설정
 --http-uwsgi-temp-path=PATH        http uwsgi 임시 파일 저장 경로 설정
 --http-scgi-temp-path=PATH         http scgi 임시 파일 저장 경로 설정
 --without-http                     HTTP 서버 비활성화
 --without-http-cache               HTTP 캐시 비활성화
 --with-mail                        POP3/IMAP4/SMTP 프록시 모듈 활성화
 [...] 
 --without-mail_smtp_module         ngx_mail_smtp_module 비활성화
 --with-google_perftools_module     ngx_google_perftools_module 활성화
 --with-cpp_test_module             ngx_cpp_test_module 활성화
 --add-module=PATH                  외부 모듈 활성화
 --with-cc=PATH                     C 컴파일러 경로 설정
 [...] 
 --with-cpu-opt=CPU                 지정된 CPU를 위한 빌드, 유효한 값:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64
 --without-pcre                     PCRE 라이브러리 사용 비활성화
 [...] 
 --with-pcre-jit                    JIT 컴파일 지원으로 PCRE 빌드
 --with-md5=DIR                     md5 라이브러리 소스 경로 설정
 --with-md5-opt=OPTIONS             md5에 대한 추가 빌드 옵션 설정
 --with-md5-asm                     md5 어셈블러 소스 사용
 --with-sha1=DIR                    sha1 라이브러리 소스 경로 설정
 --with-sha1-opt=OPTIONS            sha1에 대한 추가 빌드 옵션 설정
 --with-sha1-asm                    sha1 어셈블러 소스 사용
 --with-zlib=DIR                    zlib 라이브러리 소스 경로 설정
 --with-zlib-opt=OPTIONS            zlib에 대한 추가 빌드 옵션 설정
 --with-zlib-asm=CPU                지정된 CPU에 최적화된 zlib 어셈블러 소스 사용, 유효한 값:
                                     pentium, pentiumpro
 --with-libatomic                   libatomic_ops 라이브러리 사용 강제
 --with-libatomic=DIR               libatomic_ops 라이브러리 소스 경로 설정
 --with-openssl=DIR                 OpenSSL 라이브러리 소스 경로 설정
 --with-openssl-opt=OPTIONS         OpenSSL에 대한 추가 빌드 옵션 설정
 --with-debug                       디버그 로깅 활성화

이 명령은 어떤 모듈을 포함/제외할지 결정하는 데 많은 도움이 될 것입니다. 우리는 다음 구성 명령을 사용할 것입니다:

./configure \
    --prefix=/usr/share/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/access.log \
    --user=www-data \
    --group=www-data \
    --without-mail_pop3_module \
    --without-mail_imap_module \
    --without-mail_smtp_module \
    --without-http_fastcgi_module \
    --without-http_uwsgi_module \
    --without-http_scgi_module \
    --without-http_memcached_module \
    --with-ipv6 \
    --with-http_ssl_module \
    --with-http_spdy_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \
    --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \
    --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0

이 명령은 메일 및 우리가 필요하지 않은 핸들러와 관련된 모든 것을 제외하고, 다운로드한 3rd-party 모듈과 SPDY 패치를 포함합니다.

여기서는 Debian 표준 경로를 사용했지만, 자유롭게 변경하셔도 됩니다.

다음으로, 소스를 컴파일할 수 있습니다:

make

주의: 이 명령이 오류를 발생시키면, 문제의 원인을 확인하기 위해 오류 메시지를 주의 깊게 읽어야 합니다.

마지막으로, 컴파일된 소스를 설치합니다:

make install

이 명령은 모든 파일을 올바른 위치로 복사합니다. 완료되었습니다!

7 자동 시작 활성화

Debian은 서비스 동작을 제어할 수 있는 init 스크립트를 사용합니다. 저는 공식 nginx 패키지에서 제공하는 스크립트를 사용하고 있으며, 모든 크레딧은 유지 관리인에게 돌아갑니다:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: nginx 웹 서버 시작
# Description:       start-stop-daemon을 사용하여 nginx 시작
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
# 기본 nginx 포함 가능
if [ -f /etc/default/nginx ]; then
  . /etc/default/nginx
fi
test -x $DAEMON || exit 0
set -e
. /lib/lsb/init-functions
test_nginx_config() {
    if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then
        return 0
    else
        $DAEMON -t $DAEMON_OPTS
        return $?
    fi
}
case "$1" in
    start)
        echo -n "Starting $DESC: "
        test_nginx_config
        # /etc/default/nginx에서 ULIMIT가 설정되어 있는지 확인
        if [ -n "$ULIMIT" ]; then
            # ulimit 설정
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;; 
    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;; 
    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        test_nginx_config
        # /etc/default/nginx에서 ULIMIT가 설정되어 있는지 확인
        if [ -n "$ULIMIT" ]; then
            # ulimit 설정
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;; 
    reload)
        echo -n "Reloading $DESC configuration: "
        test_nginx_config
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;; 
    configtest|testconfig)
        echo -n "Testing $DESC configuration: "
        if test_nginx_config; then
            echo "$NAME."
        else
            exit $?
        fi
        ;; 
    status)
        status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
        ;; 
    *)
        echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
        exit 1
        ;; 
esac
exit 0

chmod를 잊지 마세요:

chmod 755 /etc/init.d/nginx

Debian 스타일의 기본 파일도 생성할 수 있습니다:

nano /etc/default/nginx

그리고 붙여넣습니다:

# 주의: ULIMIT 설정 전에 다음 페이지를 확인하는 것이 좋습니다.
#  http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# 기본값을 변경해야 하는 경우 ulimit 변수를 설정합니다.
#  예: ULIMIT="-n 4096"
#ULIMIT="-n 4096"

마지막으로, 부팅 시 nginx를 자동 시작하려면 다음을 실행할 수 있습니다:

update-rc.d nginx defaults

8 특수 모듈 지시어

여기서 nginx 구성 및 vhost 파일을 살펴보지는 않겠지만, 다음은 우리 모듈의 흥미로운 지시어입니다:

# SPDY 모듈 (vhost)
listen 443 ssl spdy;
# more_headers 모듈 (http)
more_clear_headers 'Server'; # 서버 정보 제거

naxsi

naxsi는 좀 더 복잡합니다. 먼저, 전역 구성 규칙을 nginx 구성 파일의 http 섹션에 포함해야 합니다:

nano /etc/nginx/nginx.conf

그리고 붙여넣습니다:

http {
    [...]
        include /etc/nginx/naxsi_core.rules;
    [...]
}

주의: 이 파일이 존재하는지 확인하세요. 다운로드한 아카이브에서 naxsi 구성 파일을 복사할 수 있습니다(추가 3rd-party 모듈 참조).

다음으로, vhost 템플릿 내에 기본 규칙을 포함해야 합니다:

[...]
location / {
    include /etc/nginx/naxsi.rules;
    [...]
}
[...]

그리고 차단된 요청을 위한 위치:

[...]
location /blocked {
    return 403;
    #proxy_pass http://127.0.0.1:4242; # 학습 모드
}
[...]

주의: 차단된 요청을 위한 위치가 구성 파일 /etc/nginx/naxsi.rules의 것과 일치하는지 확인하세요:

LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/blocked";
[...]

보시다시피 naxsi에는 약간 이상한 옵션이 있지만, 이상한 것이 아닙니다. 최상의 작동을 위해 문서를 읽어보는 것이 좋습니다. 제가 오랫동안 찾았던 힌트: 학습 모드 동안 차단된 요청을 전달하기 위해 파이썬 스크립트를 실행해야 하며, 이를 통해 잘못된 경고에 대한 화이트리스트를 생성해야 합니다.

9 링크 / 크레딧

Share: X/Twitter LinkedIn

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

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