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기능:
- 대시보드: http://localhost:8081 (공개)
- Docker 자동 발견 (레이블 기반)
- HTTP만 지원
프로덕션 모드: 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이 자동으로:
fastapi.localhost요청 → FastAPI 컨테이너(8000)로 라우팅- 도메인 요청 → Let’s Encrypt 인증서 발급 → HTTPS로 서빙
Let’s Encrypt 자동화
동작 원리
- 클라이언트가
yourdomain.com방문 - Traefik이 Let’s Encrypt에 인증서 신청
- Let’s Encrypt가 HTTP Challenge 발급:
.well-known/acme-challenge/<token> - Traefik이 토큰 응답 → 도메인 소유권 증명
- 인증서 발급 (90일 유효)
- 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로 리다이렉트
대시보드
라우터, 서비스, 미들웨어 상태 모니터링.
프로덕션: 기본 인증 추가
[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이 자동으로 라운드로빈 로드 밸런싱 (요청 분산).
관련 개념
- containerization — Docker와 함께 배포
- reverse-proxy — 리버스 프록시 역할, HTTPS/SSL, 로드 밸런싱
관련 엔티티
- fastapi — 라우팅 대상 웹 프레임워크
- docker — 컨테이너 기반 서비스 발견
- nginx — 경쟁 리버스 프록시 (더 경량)
- let-s-encrypt — 자동 인증서 발급 서비스