Nginx

Nginx의 계층 구조와 상속 및 재정의 방식

_Jin_ 2026. 5. 10.

 

이전 글에서는 Nginx의 설정 파일이 Block 단위로 구성된다는 것과, 각 블록이 포함 관계를 가진다는 것을 학습하였다.

이번에는 그 Block 단위의 포함 관계에서 자연스럽게 이어지는 개념인 상속(Inheritance) 에 대해 파악하고 정리해보겠다.

 

계층 구조 복습

먼저 간단하게 이전 글에서 다룬 Nginx의 블록 구조를 짚고 가자.

Main Context
└── events { }
└── http { }
         └── server { }
         └── location { }

위와 같은 구조에서 흐름은 Main → http → server → location 순서로 계층이 내려간다.

그리고 이 계층 구조에는 중요한 성질이 하나 있다.

상위 블록에서 정의한 설정은, 하위 블록에 자동으로 상속된다.

 

 

계층 구조의 상속과 재정의

 

상속의 이해를 위해서 아래의 모식도를 살펴보자 

 

위의 이미지의 http 블록에서 gzip on; 을 설정하면, 그 하위의 모든 server 블록과 location 블록에서도 gzip 압축이 적용된다.

따라서 매번 중복되는 설정을 반복하지 않고 Nginx 환경 설정을 구성함에 있어서 포괄적으로 적용할 수 있는 기능이 상속이다.

 

이를 설정 파일의 코드로 옮기면 아래와 같다.

http {
    gzip on;  # ← 이 설정은 하위 모든 블록에 상속된다

    server {
        listen 80;

        location / {
            # gzip on; 을 따로 쓰지 않아도 이미 gzip이 적용된 상태
        }
    }
}

 

가장 최상위의 Block인 http 에서 정의한 gzip on의 명령어가 하위의 server 블록에서도 그대로 적용되는 것이다. 

 

한편, 이처럼 최상위 계층에서 선언한 명령어라고 하여도, 특정 하위 계층에서의 적용은 원하지 않을 수도 있다.

이런 경우 사용가능한 개념이 덮어쓰기(Override)이다.

구체적인 예시로 아래의 코드를 살펴보자.

 

http {
    gzip on;  # ← 이 설정은 하위 모든 블록에 상속된다
	client_max_body_size 10m;	# 요청 본문의 최대 크기를 제한하는 옵션
        
    server {
        listen 80;

        location / {
            # gzip on; 을 따로 쓰지 않아도 이미 gzip이 적용된 상태
        }
        
        location /raw {
            gzip off; 
            # gzip on기능을 적용하지 않음
        }
        
        location /upload {
        	client_max_body_size 10m; # 파일 업로드의 경우 10mb까지 허용
        }    
    }
}

 

이제 /raw의 경로의 경우에는 gzip on 설정이 적용되지 않는다.

그리고 요청 본문의 최대 크기를 제한하는 옵션으로 client_max_body_size 를 최상위 http 블럭에서는 1mb로 설정하였으며 파일 업로드의 경우 10mb까지 크기로 제한하도록 /upload 경로로 재정의 하였다.(override)

 

이처럼 상속과 재정의 기능을 통해 중복을 방지하면서도 유연한 설정 파일의 구조를 사용할 수 있도록 Nginx는 지원한다.

 

 

상속이 되지 않는 디렉티브 vs 상속되는 디렉티브

중요한 주의사항이 있다. 모든 디렉티브가 상속되는 것은 아니다.

Nginx의 디렉티브는 상속 여부에 따라 아래와 같이 나눌 수 있다.

 

 

상속되지 않는 디렉티브

특정 디렉티브는 설계상 해당 블록에서만 유효하며, 하위 블록으로 상속되지 않는다.

listen 포트/IP 바인딩은 server 블록 고유의 역할. 
server_name 가상 호스트를 구분하는 식별자. server 블록 자체에 귀속됨
location 블록 자체 하위 location이 상위 location을 물려받는 개념이 없음

 

예를 들어 listen과 server_name은 아무리 http 블록에 선언해봤자 동작하지 않는다. 이 두 디렉티브는 오직 server { } 블록 안에서만 의미를 갖기 때문이다.

http {
    # ❌ 아래 두 디렉티브는 http 블록에서 선언해도 의미 없음
    # listen 80;       → server 블록에서만 유효
    # server_name _;   → server 블록에서만 유효

    server {
        listen 80;           # ✅ 여기서만 유효
        server_name example.com;  # ✅ 여기서만 유효
    }
}

 

상속되는 디렉티브

반면 아래 디렉티브들은 상위 블록에서 선언하면 하위 블록 전체에 상속된다.

proxy_connect_timeout 업스트림 서버 연결 대기 시간
gzip, gzip_types 응답 압축 여부 및 압축 대상 MIME 타입
client_max_body_size 클라이언트 요청 본문 최대 크기
error_page HTTP 상태 코드별 에러 페이지 지정
access_log, error_log 접근/에러 로그 파일 경로 및 형식

 

이 디렉티브들은 http 블록에 한 번만 선언해두면 모든 server와 location에 적용되며, 필요한 경우 하위 블록에서 재정의(Override)할 수 있다.

 

정리

이번 글에서 다룬 내용을 요약하면 다음과 같다.

  • Nginx의 설정은 계층 구조(Main → http → server → location) 로 이루어진다.
  • 상위 블록의 설정은 하위 블록에 자동으로 상속된다.
  • 하위 블록에서 같은 디렉티브를 선언하면 오버라이드(재정의) 된다.
  • listen, server_name처럼 특정 블록에만 귀속되는 디렉티브는 상속되지 않는다.
  • gzip, error_page, access_log, client_max_body_size 등은 상위 블록에서 선언하면 하위 전체에 상속된다.

댓글