AI

オープンソースエッジプロキシ比較:Nginx vs Caddy vs Traefik でリバースプロキシをセルフホストする

オープンソースラボ編集部2026年6月13日

オープンソースエッジプロキシ比較:Nginx vs Caddy vs Traefik でリバースプロキシをセルフホストする

Webアプリのフロントに立つリバースプロキシ・エッジサーバーを適切に選択することは、パフォーマンス・TLS管理・ルーティングの設計に直結します。Nginx・Caddy・TraefikはオープンソースのHTTPサーバー/プロキシとして広く使われています。

リバースプロキシの役割

  • TLS終端: HTTPSの証明書管理・Let's Encrypt自動更新
  • ロードバランシング: 複数バックエンドへのトラフィック分散
  • 静的ファイル配信: CDN前段の高速ファイル配信
  • レートリミット: APIへの過剰リクエストをブロック
  • 認証プロキシ: Basic Auth・OAuth2プロキシ

主要ツールの概要

Nginx

最も広く使われているHTTPサーバー兼リバースプロキシです。高いパフォーマンスと成熟した設定体系を持ち、静的ファイル配信・リバースプロキシ・ロードバランサーとして機能します。

# /etc/nginx/conf.d/myapp.conf

upstream backend {
    least_conn;
    server app-1:3000 weight=1;
    server app-2:3000 weight=1;
    server app-3:3000 weight=1;
    keepalive 32;
}

server {
    listen 80;
    server_name myapp.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name myapp.example.com;

    ssl_certificate /etc/ssl/certs/myapp.crt;
    ssl_certificate_key /etc/ssl/private/myapp.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # レートリミット
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }

    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://backend;
    }

    location /static/ {
        alias /var/www/static/;
        expires 1y;
        add_header Cache-Control "public, immutable";
        gzip_static on;
    }
}

Caddy

設定がシンプルでLet's Encrypt証明書を自動管理する現代的なWebサーバーです。Caddyfileという直感的な設定構文が特徴です。

# Caddyfile

myapp.example.com {
    # Let's Encrypt証明書を自動取得・更新
    tls {
        protocols tls1.2 tls1.3
    }

    # リバースプロキシ(ロードバランシング)
    reverse_proxy / {
        to app-1:3000 app-2:3000 app-3:3000
        lb_policy least_conn
        health_uri /health
        health_interval 10s
        health_timeout 5s
    }

    # 静的ファイル配信
    handle /static/* {
        root * /var/www
        file_server {
            precompressed gzip br
        }
    }

    # レートリミット(caddy-ratelimit plugin)
    rate_limit {
        zone dynamic {
            key {remote_host}
            events 100
            window 1m
        }
    }

    # ヘッダー設定
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Frame-Options DENY
        X-Content-Type-Options nosniff
    }

    log {
        output file /var/log/caddy/access.log
        format json
    }
}

# Admin API
:2019 {
    admin
}

Traefik

DockerやKubernetesと深く統合された動的プロキシです。コンテナのラベルやKubernetesのIngressリソースを読んで自動的にルーティングを設定します。

# docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.email=admin@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--api.dashboard=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt

  myapp:
    image: myapp:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)"
      - "traefik.http.routers.myapp.tls.certresolver=myresolver"
      - "traefik.http.services.myapp.loadbalancer.server.port=3000"
      - "traefik.http.middlewares.rate-limit.ratelimit.average=100"
      - "traefik.http.middlewares.rate-limit.ratelimit.burst=50"

機能比較表

比較項目NginxCaddyTraefik
TLS自動更新(Let's Encrypt)⚠️ certbot✅ ネイティブ✅ ネイティブ
設定の容易さ★★☆☆☆★★★★★★★★★☆
Docker統合⚠️ 手動✅ 自動
Kubernetes Ingress✅ ingress-nginx✅ IngressRoute
パフォーマンス★★★★★★★★★☆★★★★☆
静的ファイル配信★★★★★★★★★☆
ロードバランシング
HTTPSリダイレクト手動設定自動自動
動的設定(再起動不要)
プラグインエコシステム✅ モジュール
リソース使用量最小
ライセンスBSD-2Apache 2.0MIT
GitHub Stars21k+57k+50k+

NginxにLet's Encryptを設定する

# Certbotでlet's encrypt証明書を自動取得
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d myapp.example.com

# 自動更新cronの確認
sudo certbot renew --dry-run

# nginx設定のテスト
sudo nginx -t
sudo systemctl reload nginx

DevOps・インフラツールはDevOpsカテゴリ(/categories/devops)で一覧でき、セキュリティ関連のプロキシ設定はセキュリティカテゴリ(/categories/security)でも参照できます。

FAQ

Q. NginxとApache HTTPdはどちらを選ぶべきですか?

A. 現代のWebアプリには通常Nginxを推奨します。Nginxはイベント駆動型で非同期処理するため、高い同時接続数でもメモリ使用量が安定しています。ApacheはモジュールによるPHP実行(mod_php)が必要な場合や、.htaccessでディレクトリごとの設定が必要な場合に選ばれますが、新規プロジェクトではNginxが主流です。

Q. CaddyのTLS自動更新の仕組みを教えてください。

A. CaddyはACMEプロトコル(Let's Encrypt等)を内蔵しており、設定ファイルにドメイン名を書くだけで証明書の取得・更新・更新前の検証をすべて自動で行います。証明書はデフォルトで~/.local/share/caddy/(Linuxの場合)に保存されます。HTTP-01チャレンジ(ポート80必要)またはDNS-01チャレンジ(ワイルドカード証明書対応)を使います。

Q. TraefikはNginx Ingressと比べてどうですか?

A. KubernetesのIngress Controllerとして比較すると、Nginx Ingressは安定性と実績で優れ、ほぼすべてのKubernetesクラスターで動作します。TraefikはDashboard・ミドルウェアの柔軟さ・Let's Encrypt統合が優れ、設定がKubernetes CustomResourceとして宣言的に書けます。小規模クラスターではTraefik、大規模本番環境ではNginx Ingressが選ばれることが多いです。

Q. DockerでCaddyを使うメリットは何ですか?

A. CaddyはDockerコンテナでも証明書を永続化でき(ボリュームをマウント)、設定ファイルを変更するだけで証明書管理・HTTPSリダイレクトが自動的に機能します。Certbot+Nginxのように複数ツールを組み合わせる必要がなく、設定ミスが減ります。マルチドメインの場合でもCaddyfileに1行追加するだけで対応できます。

まとめ

ユースケース推奨ツール
高トラフィック静的ファイル配信Nginx
自動TLS・シンプル設定Caddy
DockerコンテナのAutoDiscoveryTraefik
Kubernetes Ingress Controllernginx-ingress / Traefik

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。