TIL - 20260316

juni·2026년 3월 16일

TIL

목록 보기
294/317

0316 스프링 부트 프로젝트 (8/N): Nginx를 이용한 리버스 프록시 구축


✅ 1. 리버스 프록시 (Reverse Proxy)란?

  • 리버스 프록시는 클라이언트의 요청을 대신 받아서 내부망에 있는 실제 서버(WAS)로 전달하고, 그 응답을 다시 클라이언트에게 전달하는 중개 서버입니다.

  • 클라이언트는 자신이 실제 WAS가 아닌 리버스 프록시 서버와 통신하고 있음을 알지 못합니다.

  • 왜 필요한가?:

    • 보안: 실제 애플리케이션 서버(WAS)의 IP 주소나 포트를 외부에 직접 노출하지 않아 보안을 강화할 수 있습니다.
    • 로드 밸런싱: 여러 대의 WAS로 요청을 분산시켜, 단일 서버의 과부하를 방지하고 가용성을 높일 수 있습니다.
    • SSL Offloading: HTTPS 통신에 필요한 복잡한 암호화/복호화 작업을 리버스 프록시(Nginx)가 전담하고, 내부 WAS와는 가벼운 HTTP로 통신하여 WAS의 부담을 줄여줍니다.
    • 무중단 배포: 배포 시 트래픽을 구버전에서 신버전으로 점진적으로 전환하는 등의 전략을 구현할 수 있습니다.
  • Nginx: 뛰어난 성능과 낮은 메모리 사용량 덕분에 리버스 프록시 서버로 매우 널리 사용됩니다.


✅ 2. Nginx 설치 및 기본 설정

  • AWS EC2와 같은 리눅스 서버 환경에서 Nginx를 설치하고 설정하는 과정입니다.
  1. Nginx 설치 (Amazon Linux/CentOS 기준):

    sudo yum install -y nginx
  2. Nginx 서비스 시작 및 활성화:

    sudo systemctl start nginx
    sudo systemctl enable nginx
  3. 방화벽 설정: 외부에서 HTTP(80) 및 HTTPS(443) 포트로 접근할 수 있도록 방화벽(AWS 보안 그룹 등)을 열어주어야 합니다.


✅ 3. Nginx 리버스 프록시 설정하기

  • Nginx의 설정 파일을 수정하여, 특정 도메인으로 들어온 요청을 내부에서 실행 중인 Spring Boot 애플리케이션으로 전달하도록 구성합니다.

  • 설정 파일 위치: /etc/nginx/nginx.conf 또는 /etc/nginx/conf.d/default.conf

➕ 기본 리버스 프록시 설정 예시

# /etc/nginx/conf.d/my-app.conf

server {
    # 1. 외부에서 요청을 받을 포트
    listen 80;
    # 2. 이 설정이 적용될 도메인 이름
    server_name my-app.com;

    # 3. '/' 경로로 들어오는 모든 요청을 처리
    location / {
        # 4. 요청을 http://127.0.0.1:8080 (로컬에서 실행 중인 Spring Boot WAS)로 전달
        proxy_pass http://127.0.0.1:8080;

        # 5. WAS에 클라이언트의 실제 정보를 전달하기 위한 헤더 설정 (매우 중요)
        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;
    }
}
  1. listen 80: 80번 포트(HTTP)로 들어오는 요청을 받습니다.
  2. server_name: my-app.com 도메인으로 들어온 요청에 대해서만 이 설정을 적용합니다.
  3. location /: 해당 도메인의 모든 경로(/)에 대한 요청을 처리합니다.
  4. proxy_pass: 이 설정의 핵심. 요청을 지정된 주소로 전달합니다. 127.0.0.1:8080은 현재 서버에서 8080 포트로 실행 중인 Spring Boot 애플리케이션을 의미합니다.
  5. proxy_set_header: WAS가 리버스 프록시 뒤에 있다는 사실을 인지하고, 클라이언트의 실제 IP 주소, 요청 프로토콜(http/https) 등을 올바르게 처리할 수 있도록 관련 정보를 HTTP 헤더에 담아 전달하는 중요한 설정입니다.

➕ 설정 적용

  • 설정 파일을 수정한 후에는 문법에 오류가 없는지 확인하고, Nginx 서비스를 재시작하여 변경 사항을 적용해야 합니다.

    # 설정 파일 문법 검사
    sudo nginx -t
    
    # Nginx 재시작
    sudo systemctl restart nginx

✅ 4. 무중단 배포를 위한 리버스 프록시 활용

  • Nginx 리버스 프록시를 사용하면 간단한 형태의 무중단 배포(Blue-Green과 유사)를 구현할 수 있습니다.

➕ 무중단 배포 스크립트 흐름

  1. 신규 버전 실행: 새로운 버전의 Spring Boot 애플리케이션을 다른 포트(e.g., 8081)로 실행합니다. (현재 구버전은 8080 포트에서 계속 실행 중)
  2. 헬스 체크: 8081 포트로 실행된 신규 버전이 정상적으로 구동되었는지 확인합니다.
  3. 트래픽 전환: 신규 버전이 정상이면, Nginx 설정 파일(my-app.conf)의 proxy_pass 주소를 127.0.0.1:8081로 동적으로 변경합니다.
  4. Nginx 리로드: sudo systemctl reload nginx 명령어를 실행하여, 서비스를 중단하지 않고 변경된 설정만 다시 불러옵니다. 이 순간부터 모든 새로운 요청은 신규 버전(8081)으로 전달됩니다.
  5. 구버전 종료: 구버전(8080)에서 처리 중이던 기존 요청들이 모두 완료될 때까지 잠시 기다린 후, 구버전 프로세스를 종료합니다.
  • 이러한 흐름을 셸 스크립트로 자동화하여 CI/CD 파이프라인에 통합하면, 배포 과정에서 사용자가 서비스 중단을 전혀 느끼지 않게 할 수 있습니다.

📌 요약

  • 리버스 프록시는 외부 클라이언트 요청을 받아 내부 WAS로 전달하는 중개 서버로, 보안, 로드 밸런싱, SSL 처리 등 다양한 이점을 제공합니다.
  • Nginx는 뛰어난 성능으로 리버스 프록시 서버로 널리 사용되며, proxy_pass 지시어를 통해 간단하게 설정할 수 있습니다.
  • proxy_set_header 설정은 WAS가 클라이언트의 실제 정보를 올바르게 인식하도록 돕는 중요한 부분입니다.
  • Nginx 리버스 프록시의 트래픽 전환 기능을 활용하면, 서비스 중단 없이 애플리케이션을 업데이트하는 무중단 배포를 구현할 수 있습니다.

0개의 댓글