リバースプロキシ選定
作成日:
reverse-proxy infrastructure Traefik Nginx technology-selection
概要
リバースプロキシは、クライアントとバックエンドサーバーの間に位置し、リクエストの振り分け、TLS 終端、負荷分散などを担うコンポーネント。1台のサーバーで複数サイトを運用する際の要となる技術。
リバースプロキシの役割
[インターネット]
↓
[リバースプロキシ] ← TLS終端、ルーティング、セキュリティ
↓
┌──┴──┬──────┐
↓ ↓ ↓
[App A][App B][App C]
主な機能
- TLS 終端: HTTPS を処理し、バックエンドには HTTP で転送
- ルーティング: ドメインやパスに基づいてリクエストを振り分け
- 負荷分散: 複数インスタンスにリクエストを分散
- セキュリティ: レート制限、IP 制限、認証
- 圧縮: gzip/brotli によるレスポンス圧縮
- キャッシュ: 静的コンテンツのキャッシュ
主要な選択肢
1. Traefik
特徴: コンテナネイティブなモダンリバースプロキシ
2. Nginx
特徴: 高性能で実績のあるウェブサーバー/リバースプロキシ
3. Caddy
特徴: 自動 HTTPS を内蔵したシンプルなウェブサーバー
4. HAProxy
特徴: 高性能なロードバランサー(L4/L7)
比較表
| 機能 | Traefik | Nginx | Caddy | HAProxy |
|---|---|---|---|---|
| 自動 HTTPS | ◎ 内蔵 | △ certbot必要 | ◎ 内蔵 | × 外部ツール |
| Docker 統合 | ◎ ネイティブ | △ 手動設定 | ○ plugin | △ 手動設定 |
| 動的設定 | ◎ 自動検出 | × reload必要 | ○ API | × reload必要 |
| 設定の簡単さ | ○ ラベル式 | △ 設定ファイル | ◎ 最も簡単 | △ 独自書式 |
| パフォーマンス | ○ 良好 | ◎ 最高 | ○ 良好 | ◎ 最高 |
| L7 機能 | ○ ミドルウェア | ◎ 豊富 | ○ 標準的 | ○ ACL |
| 学習曲線 | 中 | 中〜高 | 低 | 高 |
| ドキュメント | ◎ 充実 | ◎ 充実 | ○ 十分 | ○ 十分 |
| エコシステム | ○ プラグイン | ◎ モジュール | ○ プラグイン | △ 限定的 |
Traefik
概要
Docker や Kubernetes とネイティブ統合されたモダンなリバースプロキシ。コンテナの追加・削除を自動検出し、設定を動的に更新する。
メリット
- Docker 統合: ラベルで設定完結、ホットリロード不要
- 自動 HTTPS: Let’s Encrypt を内蔵、証明書の自動更新
- 動的設定: コンテナの起動/停止を自動検出
- ミドルウェア: 認証、圧縮、レート制限などを宣言的に設定
- ダッシュボード: Web UI で状態を確認可能
デメリット
- 学習コスト: 概念(Router、Service、Middleware)の理解が必要
- リソース消費: Nginx より多めのメモリ使用
- 細かいチューニング: Nginx ほどの柔軟性はない
設定例
# traefik.yml(静的設定)
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
certificatesResolvers:
le:
acme:
email: admin@example.com
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
# compose.yaml(サービス設定)
services:
traefik:
image: traefik:v3.5
ports:
- "80:80"
- "443:443"
volumes:
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-certs:/letsencrypt
restart: unless-stopped
app:
image: myapp:latest
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`)
- traefik.http.routers.app.tls=true
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.services.app.loadbalancer.server.port=3000
適したケース
- Docker/Kubernetes 環境
- 複数サービスを頻繁に追加/変更
- 自動 HTTPS が必要
- コンテナベースのマイクロサービス
Nginx
概要
高性能で実績のあるウェブサーバー。リバースプロキシ、静的ファイル配信、負荷分散など多機能。
メリット
- 高性能: イベント駆動で低リソース、高スループット
- 豊富な機能: URL リライト、キャッシュ、gzip など
- 実績: 長年の運用実績、豊富な情報
- 柔軟性: 細かい設定が可能
- 静的ファイル配信: 最速クラス
デメリット
- 手動設定: 設定ファイルの編集と reload が必要
- HTTPS 設定: certbot など外部ツールが必要
- Docker 統合: 自動検出なし、設定の手動管理
- 設定の複雑さ: 初心者には難しい場合がある
設定例
# /etc/nginx/sites-available/app.conf
server {
listen 80;
server_name app.example.com;
return 301 https://$server_name$request_uri;
}
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;
# セキュリティヘッダ
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# 圧縮
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location / {
proxy_pass http://localhost:3000;
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;
}
}
# certbot での証明書取得
sudo certbot --nginx -d app.example.com
適したケース
- 静的ファイル配信がメイン
- 細かいチューニングが必要
- 高トラフィック環境
- 既存の Nginx 知識がある
Caddy
概要
自動 HTTPS を標準装備したモダンなウェブサーバー。設定が最もシンプルで、小〜中規模サイトに適している。
メリット
- 最も簡単: 設定ファイルが直感的
- 自動 HTTPS: デフォルトで有効、設定不要
- HTTP/3 対応: 標準でサポート
- ゼロダウンタイム reload: 設定変更時にダウンしない
デメリット
- パフォーマンス: Nginx より若干低い(通常は問題にならない)
- エコシステム: Nginx ほど豊富ではない
- カスタマイズ: 複雑な要件には不向き
- Docker 統合: Traefik ほどシームレスではない
設定例
# Caddyfile
app.example.com {
reverse_proxy localhost:3000
}
blog.example.com {
reverse_proxy localhost:4000
}
api.example.com {
reverse_proxy localhost:5000
header {
Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
}
}
# compose.yaml
services:
caddy:
image: caddy:2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy-data:/data
- caddy-config:/config
restart: unless-stopped
適したケース
- 小〜中規模サイト
- 設定を簡単にしたい
- 自動 HTTPS が欲しいが Traefik は複雑に感じる
- HTTP/3 を使いたい
HAProxy
概要
高性能なロードバランサー。L4/L7 での負荷分散に特化。
メリット
- 最高性能: 負荷分散に最適化
- 高可用性: ヘルスチェック、フェイルオーバー
- 詳細な統計: リアルタイム統計情報
- L4 対応: TCP/UDP レベルのプロキシ
デメリット
- 設定の複雑さ: 独自の設定書式
- 静的ファイル配信: 非対応(別途 Nginx 等が必要)
- HTTPS: 外部ツールでの証明書管理が必要
- オーバースペック: 小規模には不要な機能が多い
適したケース
- 大規模な負荷分散
- 高可用性が最優先
- TCP/UDP レベルのプロキシ
- 既存の HAProxy 知識がある
選定の指針
判断フローチャート
Docker/Kubernetes を使用している?
├─ Yes
│ ↓
│ 頻繁にサービスを追加/変更する?
│ ├─ Yes → Traefik
│ └─ No
│ ↓
│ 設定を最小限にしたい?
│ ├─ Yes → Caddy
│ └─ No → Nginx
└─ No
↓
設定を最小限にしたい?
├─ Yes → Caddy
└─ No
↓
高度なチューニングが必要?
├─ Yes → Nginx
└─ No → Caddy
ユースケース別推奨
| ユースケース | 推奨 | 理由 |
|---|---|---|
| Docker で複数サービス | Traefik | 自動検出、ラベル設定 |
| 静的サイト複数運用 | Nginx or Caddy | シンプル、高性能 |
| 個人ブログ + API | Caddy | 最も簡単 |
| 高トラフィック | Nginx | 実績、パフォーマンス |
| マイクロサービス | Traefik | 動的設定、サービスメッシュ |
| レガシー環境 | Nginx | 安定性、情報量 |
組み合わせパターン
Traefik + Nginx(推奨構成)
Traefik をエッジプロキシ、静的ファイル配信は Nginx コンテナで行う。
services:
traefik:
image: traefik:v3.5
# Traefik の設定...
static-site:
image: nginx:alpine
volumes:
- ./public:/usr/share/nginx/html:ro
labels:
- traefik.enable=true
- traefik.http.routers.static.rule=Host(`www.example.com`)
app:
image: myapp:latest
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`)
Cloudflare + リバースプロキシ
Cloudflare を CDN/WAF として前段に配置。
[クライアント] → [Cloudflare] → [Traefik/Nginx] → [アプリ]
↑ ↑
CDN, WAF TLS終端, ルーティング
メリット:
- DDoS 保護
- グローバル CDN
- WAF(Web Application Firewall)
パフォーマンス比較
ベンチマーク目安(参考値)
| プロキシ | RPS(目安) | レイテンシ | メモリ使用量 |
|---|---|---|---|
| Nginx | 50,000+ | 最低 | 低 |
| HAProxy | 50,000+ | 最低 | 低 |
| Traefik | 30,000+ | 低 | 中 |
| Caddy | 30,000+ | 低 | 中 |
※ 実際の値は環境・設定により大きく異なる
小〜中規模では気にしなくてよい
- 月間 PV 100万以下なら、どれを選んでも問題ない
- ボトルネックは通常アプリケーション側
- 運用のしやすさを優先すべき
セキュリティ考慮事項
共通の設定
- TLS 1.2 以上を強制
- HSTS ヘッダの設定
- 不要なヘッダの削除(Server、X-Powered-By)
- レート制限の設定
- IP 制限(管理画面など)
Traefik 固有
api.insecure=falseを本番では必須docker-socket-proxyの使用を推奨- ダッシュボードは認証で保護
Nginx 固有
server_tokens off;でバージョン隠蔽- 不要なモジュールを無効化
limit_reqでレート制限
移行時の注意
Nginx → Traefik
- 既存の Nginx 設定を Traefik ラベルに変換
- certbot の証明書を Traefik 管理に移行
- 並行稼働でテスト後に切り替え
Traefik → Nginx
- ラベル設定を Nginx 設定ファイルに変換
- certbot のセットアップ
- cron での証明書更新設定
関連トピック
- Traefik - Traefik の詳細設定
- Nginx - Nginx の詳細設定
- マルチサイトホスティング - 1台のサーバーで複数サイトを運用
- ドメイン戦略 - サブドメイン vs サブディレクトリ