Traefik — 리버스 프록시 & 로드 밸런서

Summary

Docker 레이블 기반 자동 서비스 발견, Let’s Encrypt 인증서 자동화, HTTP→HTTPS 리다이렉트를 지원하는 현대적 리버스 프록시.

Docker 레이블 기반 자동 서비스 발견, Let’s Encrypt 인증서 자동화, HTTP→HTTPS 리다이렉트를 지원하는 현대적 리버스 프록시.

개요

Traefik은 API 게이트웨이/리버스 프록시로서:

  • Docker 서비스를 자동으로 발견
  • HTTP/HTTPS 라우팅 규칙 자동 적용
  • Let’s Encrypt로 SSL/TLS 인증서 자동 발급·갱신
  • 대시보드로 상태 모니터링

개발 vs 프로덕션 설정

개발 모드: traefik.dev.toml

[api]
  dashboard = true
  insecure = true  # 인증 없음
 
[entryPoints.http]
  address = ":80"
 
[providers.docker]
  endpoint = "unix:///var/run/docker.sock"
  exposedByDefault = false

기능:

프로덕션 모드: traefik.prod.toml

[api]
  dashboard = true
  address = ":8081"
 
[entryPoints.http]
  address = ":80"
  [entryPoints.http.http.redirections.entryPoint]
    to = "https"
    scheme = "https"
 
[entryPoints.https]
  address = ":443"
  [entryPoints.https.http.tls]
    certResolver = "letsencrypt"
 
[certificatesResolvers.letsencrypt.acme]
  email = "your-email@example.com"
  storage = "acme.json"
  [certificatesResolvers.letsencrypt.acme.httpChallenge]
    entryPoint = "http"
 
[providers.docker]
  endpoint = "unix:///var/run/docker.sock"
  exposedByDefault = false

기능:

  • HTTP(80) → HTTPS(443) 자동 리다이렉트
  • Let’s Encrypt 인증서 자동화
  • 대시보드 기본 인증 보호
  • HTTPS 전송

Docker 레이블로 라우팅 규칙 정의

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.fastapi.rule=Host(`fastapi.localhost`)"
  - "traefik.http.services.fastapi.loadbalancer.server.port=8000"

개발: 로컬 /etc/hosts 에 추가

127.0.0.1 fastapi.localhost

프로덕션: 도메인 DNS A 레코드 지정

yourdomain.com A 12.34.56.78 (공인 IP)

그러면 Traefik이 자동으로:

  1. fastapi.localhost 요청 → FastAPI 컨테이너(8000)로 라우팅
  2. 도메인 요청 → Let’s Encrypt 인증서 발급 → HTTPS로 서빙

Let’s Encrypt 자동화

동작 원리

  1. 클라이언트가 yourdomain.com 방문
  2. Traefik이 Let’s Encrypt에 인증서 신청
  3. Let’s Encrypt가 HTTP Challenge 발급:
    .well-known/acme-challenge/<token>
    
  4. Traefik이 토큰 응답 → 도메인 소유권 증명
  5. 인증서 발급 (90일 유효)
  6. Traefik 자동 갱신 (만료 30일 전)

필수 조건

  • ✅ 등록된 도메인 (예: example.com)
  • ✅ 공인 IP 주소 (EC2, DigitalOcean, Linode 등)
  • ✅ DNS A 레코드 지정 (도메인 → IP)
  • ✅ 포트 80/443 개방 (방화벽)
  • ✅ 이메일 주소 (인증서 갱신 알림)

Docker Compose 예제

version: '3'
services:
  traefik:
    image: traefik:latest
    ports:
      - "80:80"
      - "443:443"
      - "8081:8081"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.prod.toml:/traefik.toml
      - ./acme.json:/acme.json
    command: --configFile=/traefik.toml
 
  fastapi:
    build: .
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fastapi.rule=Host(`yourdomain.com`)"
      - "traefik.http.routers.fastapi.tls=true"
      - "traefik.http.routers.fastapi.tls.certresolver=letsencrypt"
      - "traefik.http.services.fastapi.loadbalancer.server.port=8000"

실행:

docker-compose up -d

결과:

  • Traefik이 yourdomain.com 요청을 FastAPI로 라우팅
  • Let’s Encrypt 인증서 자동 발급·갱신
  • HTTP 요청 자동 HTTPS로 리다이렉트

대시보드

개발: http://localhost:8081

라우터, 서비스, 미들웨어 상태 모니터링.

프로덕션: 기본 인증 추가

[api]
  dashboard = true
  middlewares = ["basicauth"]
 
[http.middlewares.basicauth]
  users = ["user:hashedpassword"]

로드 밸런싱

여러 FastAPI 인스턴스 간 트래픽 분산:

services:
  traefik:
    # ... (위와 동일)
  
  fastapi1:
    build: .
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fastapi.rule=Host(`yourdomain.com`)"
      - "traefik.http.services.fastapi.loadbalancer.server.port=8000"
 
  fastapi2:
    build: .
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fastapi.rule=Host(`yourdomain.com`)"
      - "traefik.http.services.fastapi.loadbalancer.server.port=8000"
 
  fastapi3:
    build: .
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fastapi.rule=Host(`yourdomain.com`)"
      - "traefik.http.services.fastapi.loadbalancer.server.port=8000"

Traefik이 자동으로 라운드로빈 로드 밸런싱 (요청 분산).

관련 개념

관련 엔티티

  • fastapi — 라우팅 대상 웹 프레임워크
  • docker — 컨테이너 기반 서비스 발견
  • nginx — 경쟁 리버스 프록시 (더 경량)
  • let-s-encrypt — 자동 인증서 발급 서비스

소스