본문 바로가기
Infra/Nginx

[Nginx] 라우팅과 정적 파일 서비스

by coding_whale 2026. 4. 26.
반응형

웹 서버를 운영하다 보면 클라이언트의 요청 주소(URI)를 서버의 실제 디렉토리와 연결하거나, 특정 주소를 다른 곳으로 돌려보내야 하는 상황을 끊임없이 마주하게 된다. Nginx는 단순히 요청을 전달하는 것을 넘어, 들어온 URI를 분석하여 최적의 경로로 매핑하는 강력한 라우팅 엔진이다.

특히 하나의 서버에서 여러 서비스를 운영하는 가상 호스트 환경이나, 복잡한 주소 체계를 단순화해야 하는 실무 환경에서 Nginx의 라우팅 로직을 정확히 이해하는 것은 필수적이다. 오늘은 정적 파일 서빙의 핵심인 root와 alias의 차이점부터, 서버 블록의 매칭 우선순위, 그리고 서비스 운영의 유연성을 더해주는 return과 rewrite의 차이를 정리해 본다.


1. 주요 특징 및 핵심 로직

Nginx 라우팅의 핵심은 클라이언트가 보낸 '가상'의 주소(URI)를 서버의 '물리적'인 경로로 연결하거나, 새로운 주소로 다시 보내는 과정에 있다.

이 시스템을 지탱하는 논리적 축은 다음과 같다.

  • 가상 호스트(Virtual Hosting): Host 헤더를 분석하여 하나의 IP에서 여러 도메인을 구분하여 처리한다.
  • 경로 매핑 전략: URI와 디렉토리 구조의 일치 여부에 따라 root 또는 alias를 선택한다.
  • URI 변환 매커니즘: 클라이언트에게 새 주소를 요구하는 리다이렉트와 서버 내부에서 주소를 바꾸는 리라이트로 나뉜다.


3. 상세 가이드 및 심층 분석 (Detailed Guide)

 

🔍 섹션 1. 정적 파일 매핑: root vs alias

정적 파일을 서빙할 때 가장 먼저 마주하는 설정이다. 두 지시어는 URI를 경로로 환산하는 계산 방식에서 결정적인 차이가 있다.

  • root (일치형): 요청된 URI가 지정된 경로 뒤에 그대로 붙는다.
    • 공식: 최종 경로 = root 설정값 + URI
    • 언제: URI 구조와 실제 서버의 디렉토리 구조가 완벽히 일치할 때 사용한다.
    • 예시: location /css { root /var/www/html; } -> /var/www/html/css/style.css 찾음.
  • alias (치환형): 요청된 URI 중 location에 정의된 부분을 제외하고 나머지를 지정된 경로 뒤에 붙인다.
    • 공식: 최종 경로 = alias 설정값 + (URI - location)
    • 언제: 요청 URI와 실제 파일이 위치한 경로가 다를 때 사용한다.
    • 예시: location /static { alias /var/www/assets; } -> /var/www/assets/style.css 찾음.


🔍 섹션 2. 서버 블록(Server Block)과 매칭 우선순위

Nginx는 하나의 서버에서 여러 도메인을 운영할 때 server_name 지시어를 사용한다. 이때 클라이언트의 Host 헤더와 대조하여 적절한 블록을 찾는 엄격한 우선순위가 존재한다.

  1. 정확히 일치하는 이름: example.com
  2. 앞쪽 와일드카드: *.example.com
  3. 뒤쪽 와일드카드: www.example.*
  4. 정규표현식 매칭: ~^www\.example\.com$
  5. default_server: 어떤 블록도 매칭되지 않을 때 최종적으로 도착하는 곳.

 

🔍 섹션 3. URI 변환: 리다이렉트(return) vs 리라이트(rewrite)

두 방식 모두 주소를 변경하지만, 서버 내부에서 끝나느냐 클라이언트가 다시 요청하느냐의 차이가 크다.

  • 리다이렉트 (return): 클라이언트에게 상태 코드를 보내 브라우저 주소창을 바꾸게 만든다.
    • 특징: 클라이언트가 주소 변경을 인지함. 외부 주소로도 이동 가능.
  • 리라이트 (rewrite): 서버 내부에서만 URI를 변환하여 다른 자원을 서빙한다.
    • 특징: 클라이언트는 주소 변경을 모름. 서버 내부 자원 매핑에 유리.

 

4. 실전 코드 분석: 효율적인 라우팅 구성

위의 개념들을 종합하여 구성한 실무형 설정 예시다.

http {
    # 📌 1. 보안을 위한 기본 차단 설정
    server {
        listen 80 default_server;
        server_name _;
        return 444; # 등록되지 않은 도메인 요청은 즉시 연결 끊기
    }

    # 📌 2. 도메인별 분기 및 리다이렉트
    server {
        listen 80;
        server_name example.com [www.example.com](https://www.example.com);
        
        # HTTPS 강제 이동 (return 권장)
        return 301 https://$host$request_uri;
    }

    # 📌 3. 상세 라우팅 및 정적 파일 매핑
    server {
        listen 443 ssl;
        server_name [www.example.com](https://www.example.com);
        root /var/www/html;

        # URI와 구조가 일치하는 경우
        location /css/ {
            root /var/www/html;
        }

        # URI와 구조가 다른 경우 (alias 사용)
        location /static/ {
            alias /var/www/assets/;
        }

        # 정규식 기반 내부 경로 변환
        location /blog/ {
            # /blog/123 -> /posts?id=123 (내부 변환 후 다시 매칭)
            rewrite ^/blog/([0-9]+)$ /posts?id=$1 last;
        }
    }
}

 

5. 실무 팁 및 주의사항 

  • 내용: '정규식이 필요한가?', '단순 리다이렉트인가?', '내부 URI 변환인가?' 등의 질문을 통해 return과 rewrite 중 무엇을 쓸지 가이드하는 Flowchart. (참고: 4 라우팅 분기.png)
  • 성능 우선순위: 복잡한 정규식 캡처가 필요한 게 아니라면 rewrite보다 return을 권장한다. Nginx 엔진이 훨씬 더 빠르게 처리하기 때문이다.
  • alias 사용 시 끝 슬래시(/) 주의: location 끝에 /가 있다면 alias 경로 끝에도 반드시 /를 붙여야 한다. 그렇지 않으면 경로가 꼬여 404 에러를 마주할 수 있다.
  • MDC 누수 방지(보안): default_server에 return 444를 설정해두면, IP 주소로 직접 접근하거나 잘못된 도메인으로 들어오는 스캔 공격을 효과적으로 방어할 수 있다.

 

6. 마무리 

Nginx의 라우팅 공부의 핵심은 단순히 명령어를 외우는 것이 아니라, '어떤 논리로 파일을 찾아가는가'를 이해하는 데 있다.
root와 alias의 경로 계산법을 명확히 구분하고, return과 rewrite를 상황에 맞게 골라 쓰는 것만으로도 웹 서버 설정의 완성도는 비약적으로 높아진다. 

반응형