튜토리얼

Nginx 리버스 프록시 설정 완벽 가이드

강코의 코딩 일기 2026. 3. 12. 11:01

안녕하세요! 오늘날 복잡한 웹 애플리케이션 환경에서 Nginx 리버스 프록시는 필수적인 요소로 자리 잡았습니다. 이 가이드에서는 Nginx 리버스 프록시가 무엇인지부터 시작하여, 설치, 기본 설정, 그리고 실제 서비스에 적용할 수 있는 고급 설정까지 모든 것을 자세히 다룰 것입니다. 웹 서비스의 성능과 보안을 한 단계 끌어올리고 싶다면, 이 글을 끝까지 주목해 주세요.

Nginx 리버스 프록시 설정 완벽 가이드

Image by kevinandthepup on Pixabay

리버스 프록시란 무엇인가요?

리버스 프록시(Reverse Proxy)는 클라이언트(웹 브라우저)와 웹 서버(Origin Server) 사이에 위치하여 클라이언트의 요청을 대신 받아 내부 서버로 전달하고, 서버의 응답을 다시 클라이언트에게 전달하는 역할을 하는 서버를 말합니다. 쉽게 말해, 클라이언트가 직접 백엔드 서버에 접근하는 것이 아니라, 리버스 프록시 서버를 통해 모든 요청이 이루어지는 구조입니다.

핵심 개념: 리버스 프록시는 클라이언트가 실제 백엔드 서버의 존재나 위치를 알지 못하도록 보호하며, 단일 진입점 역할을 수행합니다.

리버스 프록시와 자주 비교되는 개념으로 포워드 프록시(Forward Proxy)가 있습니다. 둘의 차이점을 표로 정리해 보았습니다.

구분 리버스 프록시 포워드 프록시
주체 서버(백엔드) 앞 클라이언트 앞
목적 서버 보호, 로드 밸런싱, SSL 오프로드, 캐싱 클라이언트 익명성 보장, 특정 사이트 접근 제어, 캐싱
클라이언트 인지 여부 클라이언트는 프록시를 실제 서버로 인지 클라이언트는 프록시를 인지하고 설정
예시 Nginx, Apache HTTP Server Squid

Nginx 리버스 프록시의 장점

Nginx를 리버스 프록시로 사용하면 다음과 같은 여러 가지 이점을 얻을 수 있습니다.

  • 로드 밸런싱 (Load Balancing): 여러 백엔드 서버에 클라이언트 요청을 분산하여 특정 서버에 부하가 집중되는 것을 방지하고 서비스의 가용성과 성능을 향상시킵니다.
  • 보안 강화 (Security Enhancement): 실제 백엔드 서버의 IP 주소와 포트를 외부에 노출하지 않아 직접적인 공격으로부터 서버를 보호합니다.
  • SSL/TLS 종료 (SSL/TLS Termination): Nginx에서 SSL/TLS 암호화를 처리(종료)하여 백엔드 서버의 부하를 줄이고, 백엔드 서버 간의 통신은 HTTP로 유지하여 성능을 최적화할 수 있습니다.
  • 캐싱 (Caching): 자주 요청되는 콘텐츠를 Nginx 서버에 캐싱하여 백엔드 서버에 대한 요청을 줄이고 응답 시간을 단축시킵니다.
  • 단일 진입점 (Single Entry Point): 여러 백엔드 서비스를 하나의 도메인(또는 IP)으로 통합하여 관리 및 접근을 용이하게 합니다.
  • 정적 파일 서빙 (Static File Serving): Nginx는 정적 파일 서빙에 매우 강력하므로, 백엔드 애플리케이션 서버가 처리할 필요 없이 Nginx가 직접 정적 파일을 제공하여 부하를 줄일 수 있습니다.
Nginx 리버스 프록시 설정 완벽 가이드

Image by kareni on Pixabay

Nginx 설치 및 기본 설정

Nginx를 리버스 프록시로 사용하려면 먼저 Nginx를 설치해야 합니다. 여기서는 Ubuntu와 CentOS 기준으로 설치 방법을 간략하게 설명합니다.

Ubuntu/Debian 계열:

sudo apt update
sudo apt install nginx

CentOS/RHEL 계열:

sudo yum install epel-release
sudo yum install nginx

설치 후 Nginx 서비스를 시작하고 부팅 시 자동 실행되도록 설정합니다.

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Nginx의 기본 설정 파일은 주로 /etc/nginx/nginx.conf에 위치하며, 사이트별 설정은 /etc/nginx/sites-available/ 디렉토리에 파일을 생성하고 /etc/nginx/sites-enabled/로 심볼릭 링크를 걸어 관리하는 것이 일반적입니다.

Nginx 리버스 프록시 설정 완벽 가이드

Image by Cao135 on Pixabay

Nginx 리버스 프록시 설정하기

이제 Nginx를 리버스 프록시로 설정하는 방법을 알아보겠습니다. 가장 기본적인 리버스 프록시 설정은 server 블록 내의 location 블록에서 proxy_pass 지시어를 사용하는 것입니다.

예를 들어, example.com으로 들어오는 모든 요청을 내부망의 http://192.168.1.100:8080에서 실행 중인 웹 애플리케이션으로 전달하고 싶다고 가정해 봅시다. /etc/nginx/sites-available/example.com 파일을 다음과 같이 생성합니다.

# /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

각 지시어의 의미는 다음과 같습니다.

  • listen 80;: 80번 포트로 들어오는 HTTP 요청을 수신합니다.
  • server_name example.com www.example.com;: 이 서버 블록이 응답할 도메인 이름을 설정합니다.
  • location / { ... }: 모든 URL 경로(/)에 대한 요청을 처리합니다.
  • proxy_pass http://192.168.1.100:8080;: 이 지시어가 바로 리버스 프록시의 핵심입니다. 클라이언트의 요청을 지정된 백엔드 서버(http://192.168.1.100:8080)로 전달합니다.
  • proxy_set_header ...;: 백엔드 서버가 클라이언트의 실제 정보(IP 주소, 프로토콜 등)를 알 수 있도록 HTTP 헤더를 설정합니다.
    • Host $host;: 원본 요청의 Host 헤더를 백엔드 서버로 전달합니다.
    • X-Real-IP $remote_addr;: 클라이언트의 실제 IP 주소를 전달합니다.
    • X-Forwarded-For $proxy_add_x_forwarded_for;: 요청을 보낸 클라이언트의 IP 주소와 프록시 서버들을 거쳐온 IP 주소 목록을 전달합니다.
    • X-Forwarded-Proto $scheme;: 클라이언트가 사용한 프로토콜(HTTP 또는 HTTPS)을 전달합니다.

설정 파일을 생성한 후에는 sites-enabled 디렉토리로 심볼릭 링크를 생성하고 Nginx 설정을 테스트한 후 다시 로드해야 합니다.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

고급 설정 및 팁

1. SSL/TLS Termination

Nginx에서 HTTPS 요청을 처리하고 백엔드로는 HTTP로 전달하는 SSL/TLS 종료 설정을 해보겠습니다. 이를 위해서는 SSL/TLS 인증서와 개인 키가 필요합니다.

# /etc/nginx/sites-available/example.com_ssl
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # 인증서 경로
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 개인 키 경로
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; # 이 경우 $scheme은 "https"가 됩니다.
    }
}

# HTTP 요청을 HTTPS로 리다이렉트 (선택 사항)
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

2. 로드 밸런싱

여러 백엔드 서버에 요청을 분산하려면 upstream 블록을 사용하여 백엔드 서버 그룹을 정의할 수 있습니다.

# upstream 블록으로 백엔드 서버 그룹 정의
upstream backend_servers {
    server 192.168.1.100:8080 weight=3; # 가중치 설정
    server 192.168.1.101:8080;
    server 192.168.1.102:8081 backup; # 백업 서버
    # 기본적으로 Round Robin 방식 (다른 방식: least_conn, ip_hash 등)
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers; # upstream 그룹 이름 사용
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. 캐싱

Nginx는 proxy_cache 지시어를 통해 강력한 캐싱 기능을 제공하여 백엔드 서버의 부하를 크게 줄일 수 있습니다. 먼저 nginx.conf 파일의 http 블록 내부에 캐시 저장 공간을 정의합니다.

http {
    ...
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g
                     inactive=60m use_temp_path=off;
    ...
}

그리고 server 또는 location 블록에서 이 캐시를 사용하도록 설정합니다.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m; # 200, 302 응답은 10분간 캐시
        proxy_cache_valid 404 1m; # 404 응답은 1분간 캐시
        proxy_cache_revalidate on;
        proxy_cache_min_uses 1;
        add_header X-Proxy-Cache $upstream_cache_status; # 캐시 상태 확인용 헤더
    }
}

이 외에도 Nginx 리버스 프록시는 HTTP/2 지원, WebSocket 프록시, GZIP 압축, Rate Limiting 등 다양한 고급 기능들을 제공하여 웹 서비스의 성능과 안정성을 극대화할 수 있습니다.

지금까지 Nginx 리버스 프록시의 개념부터 설치, 기본 설정, 그리고 SSL/TLS 종료, 로드 밸런싱, 캐싱과 같은 고급 설정까지 완벽하게 살펴보았습니다. Nginx는 웹 서비스 운영에 있어 강력하고 유연한 도구이며, 이 가이드를 통해 여러분의 웹 환경을 더욱 견고하고 효율적으로 만들 수 있기를 바랍니다.

혹시 Nginx 리버스 프록시 설정 중 궁금한 점이나 추가적으로 다루었으면 하는 내용이 있다면 댓글로 알려주세요!