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;
}
}동작:
- 클라이언트가
yourdomain.com/api/users요청 - Nginx가 라운드로빈으로 app1/2/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=8000Traefik vs Nginx
| 특성 | Traefik | Nginx |
|---|---|---|
| 설정 방식 | Docker 레이블 (자동) | 설정 파일 (수동) |
| 인증서 자동화 | Let’s Encrypt 내장 | 별도 도구(certbot) |
| 학습곡선 | 가파름 | 완만함 |
| 복잡한 설정 | 어려움 | 쉬움 |
| 성능 | 좋음 | 매우 좋음 |
| 메모리 | 약간 많음 | 매우 적음 |
선택 기준:
- Traefik: Docker 기반 마이크로서비스, 자동화 우선
- Nginx: 전통적 배포, 세밀한 성능 조정 필요
관련 개념
- reverse-proxy — 리버스 프록시 역할, 로드 밸런싱
- containerization — Docker Compose로 다중 서비스 배포