リバースプロキシ選定

作成日:
reverse-proxy infrastructure Traefik Nginx technology-selection

概要

リバースプロキシは、クライアントとバックエンドサーバーの間に位置し、リクエストの振り分け、TLS 終端、負荷分散などを担うコンポーネント。1台のサーバーで複数サイトを運用する際の要となる技術。

リバースプロキシの役割

[インターネット]

[リバースプロキシ] ← TLS終端、ルーティング、セキュリティ

   ┌──┴──┬──────┐
   ↓     ↓      ↓
[App A][App B][App C]

主な機能

  1. TLS 終端: HTTPS を処理し、バックエンドには HTTP で転送
  2. ルーティング: ドメインやパスに基づいてリクエストを振り分け
  3. 負荷分散: 複数インスタンスにリクエストを分散
  4. セキュリティ: レート制限、IP 制限、認証
  5. 圧縮: gzip/brotli によるレスポンス圧縮
  6. キャッシュ: 静的コンテンツのキャッシュ

主要な選択肢

1. Traefik

特徴: コンテナネイティブなモダンリバースプロキシ

2. Nginx

特徴: 高性能で実績のあるウェブサーバー/リバースプロキシ

3. Caddy

特徴: 自動 HTTPS を内蔵したシンプルなウェブサーバー

4. HAProxy

特徴: 高性能なロードバランサー(L4/L7)

比較表

機能TraefikNginxCaddyHAProxy
自動 HTTPS◎ 内蔵△ certbot必要◎ 内蔵× 外部ツール
Docker 統合◎ ネイティブ△ 手動設定○ plugin△ 手動設定
動的設定◎ 自動検出× reload必要○ API× reload必要
設定の簡単さ○ ラベル式△ 設定ファイル◎ 最も簡単△ 独自書式
パフォーマンス○ 良好◎ 最高○ 良好◎ 最高
L7 機能○ ミドルウェア◎ 豊富○ 標準的○ ACL
学習曲線中〜高
ドキュメント◎ 充実◎ 充実○ 十分○ 十分
エコシステム○ プラグイン◎ モジュール○ プラグイン△ 限定的

Traefik

概要

Docker や Kubernetes とネイティブ統合されたモダンなリバースプロキシ。コンテナの追加・削除を自動検出し、設定を動的に更新する。

メリット

  1. Docker 統合: ラベルで設定完結、ホットリロード不要
  2. 自動 HTTPS: Let’s Encrypt を内蔵、証明書の自動更新
  3. 動的設定: コンテナの起動/停止を自動検出
  4. ミドルウェア: 認証、圧縮、レート制限などを宣言的に設定
  5. ダッシュボード: Web UI で状態を確認可能

デメリット

  1. 学習コスト: 概念(Router、Service、Middleware)の理解が必要
  2. リソース消費: Nginx より多めのメモリ使用
  3. 細かいチューニング: 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

概要

高性能で実績のあるウェブサーバー。リバースプロキシ、静的ファイル配信、負荷分散など多機能。

メリット

  1. 高性能: イベント駆動で低リソース、高スループット
  2. 豊富な機能: URL リライト、キャッシュ、gzip など
  3. 実績: 長年の運用実績、豊富な情報
  4. 柔軟性: 細かい設定が可能
  5. 静的ファイル配信: 最速クラス

デメリット

  1. 手動設定: 設定ファイルの編集と reload が必要
  2. HTTPS 設定: certbot など外部ツールが必要
  3. Docker 統合: 自動検出なし、設定の手動管理
  4. 設定の複雑さ: 初心者には難しい場合がある

設定例

# /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 を標準装備したモダンなウェブサーバー。設定が最もシンプルで、小〜中規模サイトに適している。

メリット

  1. 最も簡単: 設定ファイルが直感的
  2. 自動 HTTPS: デフォルトで有効、設定不要
  3. HTTP/3 対応: 標準でサポート
  4. ゼロダウンタイム reload: 設定変更時にダウンしない

デメリット

  1. パフォーマンス: Nginx より若干低い(通常は問題にならない)
  2. エコシステム: Nginx ほど豊富ではない
  3. カスタマイズ: 複雑な要件には不向き
  4. 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 での負荷分散に特化。

メリット

  1. 最高性能: 負荷分散に最適化
  2. 高可用性: ヘルスチェック、フェイルオーバー
  3. 詳細な統計: リアルタイム統計情報
  4. L4 対応: TCP/UDP レベルのプロキシ

デメリット

  1. 設定の複雑さ: 独自の設定書式
  2. 静的ファイル配信: 非対応(別途 Nginx 等が必要)
  3. HTTPS: 外部ツールでの証明書管理が必要
  4. オーバースペック: 小規模には不要な機能が多い

適したケース

  • 大規模な負荷分散
  • 高可用性が最優先
  • 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シンプル、高性能
個人ブログ + APICaddy最も簡単
高トラフィック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(目安)レイテンシメモリ使用量
Nginx50,000+最低
HAProxy50,000+最低
Traefik30,000+
Caddy30,000+

※ 実際の値は環境・設定により大きく異なる

小〜中規模では気にしなくてよい

  • 月間 PV 100万以下なら、どれを選んでも問題ない
  • ボトルネックは通常アプリケーション側
  • 運用のしやすさを優先すべき

セキュリティ考慮事項

共通の設定

  1. TLS 1.2 以上を強制
  2. HSTS ヘッダの設定
  3. 不要なヘッダの削除(Server、X-Powered-By)
  4. レート制限の設定
  5. IP 制限(管理画面など)

Traefik 固有

  • api.insecure=false を本番では必須
  • docker-socket-proxy の使用を推奨
  • ダッシュボードは認証で保護

Nginx 固有

  • server_tokens off; でバージョン隠蔽
  • 不要なモジュールを無効化
  • limit_req でレート制限

移行時の注意

Nginx → Traefik

  1. 既存の Nginx 設定を Traefik ラベルに変換
  2. certbot の証明書を Traefik 管理に移行
  3. 並行稼働でテスト後に切り替え

Traefik → Nginx

  1. ラベル設定を Nginx 設定ファイルに変換
  2. certbot のセットアップ
  3. cron での証明書更新設定

関連トピック