리버스 프록시 선택 기준
리버스 프록시는 클라이언트와 백엔드 서버 사이에서 요청을 중계하고, SSL 종료, 로드 밸런싱, 캐싱 등을 담당합니다. Nginx, Caddy, Traefik은 각각 다른 철학과 장점을 가지고 있어 사용 환경에 따라 최적 선택이 달라집니다.
Nginx — 업계 표준
# /etc/nginx/sites-available/app.conf
upstream backend {
least_conn;
server 127.0.0.1:3000 weight=3;
server 127.0.0.1:3001 weight=2;
server 127.0.0.1:3002 backup;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location / {
proxy_pass http://backend;
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;
}
location /static/ {
root /var/www;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Caddy — 자동 HTTPS
# Caddyfile
app.example.com {
reverse_proxy localhost:3000 localhost:3001 {
lb_policy least_conn
health_uri /health
health_interval 10s
}
file_server /static/* {
root /var/www
}
encode gzip zstd
log {
output file /var/log/caddy/access.log
format json
}
}
# API 서버
api.example.com {
reverse_proxy localhost:8080 {
header_up X-Real-IP {remote_host}
}
rate_limit {remote.ip} 100r/m
}
Traefik — 동적 구성의 왕
# docker-compose.yml
version: '3'
services:
traefik:
image: traefik:v3.0
command:
- --providers.docker=true
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.email=admin@example.com
- --certificatesresolvers.le.acme.storage=/acme/acme.json
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
app:
image: myapp:latest
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host('app.example.com')
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.services.app.loadbalancer.server.port=3000
3종 비교표
| 항목 | Nginx | Caddy | Traefik |
|---|---|---|---|
| SSL 자동화 | 수동 (certbot) | 자동 내장 | 자동 내장 |
| 설정 방식 | 정적 파일 | Caddyfile/API | Docker Labels |
| 성능 | 최고 | 우수 | 우수 |
| 학습 곡선 | 높음 | 낮음 | 중간 |
| 생태계 | 매우 넓음 | 성장 중 | 컨테이너 특화 |
| 동적 구성 | reload 필요 | API 지원 | 자동 감지 |
| 최적 환경 | 범용 | 소규모/중규모 | Kubernetes/Docker |
선택 가이드
- Nginx: 최고의 성능, 풍부한 모듈, 기존 인프라와 호환성이 중요할 때
- Caddy: 간편한 설정, 자동 HTTPS가 필요한 소중규모 프로젝트
- Traefik: Docker/Kubernetes 환경에서 서비스가 동적으로 추가/제거될 때
- 세 가지 모두 HTTP/2, WebSocket, gRPC 프록시를 지원합니다
- 대부분의 경우 성능 차이보다 운영 편의성이 더 중요한 선택 기준입니다
댓글 0