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.gznaxsi
Naxsi는 nginx를 위한 오픈 소스, 고성능, 낮은 규칙 유지 관리 웹 애플리케이션 방화벽 모듈입니다 - 기능적으로 mod_security와 매우 유사합니다. 우리는 고객의 웹 애플리케이션을 보호하기 위해 이를 사용할 것입니다:
wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz
tar -xzvf naxsi-core-0.49.tgzSPDY
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 0chmod를 잊지 마세요:
chmod 755 /etc/init.d/nginxDebian 스타일의 기본 파일도 생성할 수 있습니다:
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 defaults8 특수 모듈 지시어
여기서 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 링크 / 크레딧
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.