Nginx — 경량 웹 서버 & 리버스 프록시

Summary

고성능, 저메모리 웹 서버이자 리버스 프록시. 정적 파일 제공, 로드 밸런싱, HTTPS/SSL 종료 역할.

고성능, 저메모리 웹 서버이자 리버스 프록시. 정적 파일 제공, 로드 밸런싱, HTTPS/SSL 종료 역할.

개요

Nginx는:

  • 웹 서버: 정적 파일(HTML, CSS, JS) 제공
  • 리버스 프록시: 클라이언트 요청을 백엔드 서버(FastAPI)에 전달
  • 로드 밸런서: 여러 백엔드 인스턴스에 요청 분산
  • 경량: Apache보다 메모리 효율적

기본 구조

클라이언트
    ↓ (HTTPS 443)
[Nginx: 리버스 프록시 + SSL 종료]
    ↓ (HTTP 8000)
[FastAPI 인스턴스 1]
[FastAPI 인스턴스 2]
[FastAPI 인스턴스 3]

로드 밸런싱 설정

nginx.conf 예제

upstream fastapi {
    server app1:8000;
    server app2:8000;
    server app3:8000;
}
 
server {
    listen 80;
    server_name yourdomain.com;
 
    location / {
        proxy_pass http://fastapi;
        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. 클라이언트가 yourdomain.com/api/users 요청
  2. Nginx가 라운드로빈으로 app1/2/3 중 하나 선택
  3. FastAPI 인스턴스가 처리

로드 밸런싱 알고리즘

upstream fastapi {
    # 라운드로빈 (기본)
    server app1:8000;
    server app2:8000;
    
    # 또는: 최소 연결 우선
    least_conn;
    server app1:8000;
    server app2:8000;
    
    # 또는: IP 해시 (같은 클라이언트 → 같은 서버)
    ip_hash;
    server app1:8000;
    server app2:8000;
}

SSL/TLS 종료

HTTPS 설정 (Let’s Encrypt 인증서)

server {
    listen 443 ssl http2;
    server_name yourdomain.com;
 
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
 
    location / {
        proxy_pass http://fastapi;
        proxy_set_header X-Forwarded-Proto https;
    }
}
 
# HTTP → HTTPS 리다이렉트
server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$server_name$request_uri;
}

Docker Compose 예제

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - app1
      - app2
      - app3
 
  app1:
    build: .
    environment:
      - PORT=8000
 
  app2:
    build: .
    environment:
      - PORT=8000
 
  app3:
    build: .
    environment:
      - PORT=8000

Traefik vs Nginx

특성TraefikNginx
설정 방식Docker 레이블 (자동)설정 파일 (수동)
인증서 자동화Let’s Encrypt 내장별도 도구(certbot)
학습곡선가파름완만함
복잡한 설정어려움쉬움
성능좋음매우 좋음
메모리약간 많음매우 적음

선택 기준:

  • Traefik: Docker 기반 마이크로서비스, 자동화 우선
  • Nginx: 전통적 배포, 세밀한 성능 조정 필요

관련 개념

관련 엔티티

  • fastapi — 백엔드 웹 프레임워크
  • traefik — 경쟁 리버스 프록시 (자동화 강점)

소스