AI

OSSのリバースプロキシ比較:Nginx vs Caddy vs Traefik でWebサーバーを自動HTTPS対応にする

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

OSSのリバースプロキシ比較:Nginx vs Caddy vs Traefik でWebサーバーを自動HTTPS対応にする

AWS CloudFront(月$0.085/GB〜)・Cloudflare(月$0〜$20〜)に対して、Nginx(最も使われているOSSWebサーバー)・Caddy(自動HTTPS・設定が最もシンプル)・Traefik(Kubernetes・Docker Compose向け自動設定)はOSSのリバースプロキシ・Webサーバーです。

リバースプロキシが必要な場面

  • HTTPS自動化: Let's Encryptの証明書取得・更新を自動化する
  • ロードバランシング: 複数バックエンドサーバーにリクエストを分散する
  • パスベースルーティング: /api → Node.js、/ → Next.js、/docs → Swagger UI
  • レートリミット・WAF: 不正アクセスのブロック・DDoS軽減

主要ツールの概要

Nginx

1994年に開発が始まったC言語製のWebサーバー・リバースプロキシです。GitHubスター20k+(nginx/nginx)。世界最も使われているWebサーバー(Webサイトの約33%がNginxを使用)で、静的ファイル配信・リバースプロキシ・ロードバランシング・WebSocket・HTTP/2・Gzip圧縮を高パフォーマンスで提供。設定ファイルは複雑ですが柔軟性が最高です。

# /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name myapp.yourcompany.com;
    return 301 https://$server_name$request_uri;
}

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

    ssl_certificate /etc/letsencrypt/live/myapp.yourcompany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/myapp.yourcompany.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:10m;

    # セキュリティヘッダー
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Next.jsへのリバースプロキシ
    location / {
        proxy_pass http://localhost:3000;
        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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }

    # APIサーバーへのルーティング
    location /api/v2/ {
        proxy_pass http://localhost:8000/;  # FastAPI
        proxy_read_timeout 60s;
        proxy_connect_timeout 10s;
    }

    # 静的ファイルのキャッシュ
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        proxy_pass http://localhost:3000;
    }

    # レートリミット(/api は1秒10リクエストまで)
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://localhost:3000;
    }
}

# レートリミットゾーン定義(nginxのmainコンテキストに追加)
# limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# Let's Encrypt SSL証明書をCertbotで取得・自動更新
apt install certbot python3-certbot-nginx

# 証明書取得(Nginxの設定が /etc/nginx/sites-enabled/ に存在する場合)
certbot --nginx -d myapp.yourcompany.com -d www.myapp.yourcompany.com   --email admin@yourcompany.com --agree-tos --non-interactive

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

# cron で毎日2回更新チェック(/etc/cron.d/certbot)
# 0 */12 * * * root certbot renew --quiet --nginx

Caddy

2015年に公開されたGo製のWebサーバーです。GitHubスター59k+。自動HTTPS(Let's Encrypt/ZeroSSL)が組み込みで、証明書の取得・更新・更新を設定不要で行う点が最大の特徴。Caddyfile設定は人間が読みやすく、Nginxの設定に比べて1/3〜1/5の行数で同等の設定が書けます。

# Caddyfile(Nginxの設定と同等の内容を最小限の記述で実現)

myapp.yourcompany.com {
    # 自動HTTPS(証明書の取得・更新を自動実行)

    # セキュリティヘッダー
    header {
        X-Frame-Options SAMEORIGIN
        X-Content-Type-Options nosniff
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        -Server
    }

    # パスベースルーティング
    handle /api/* {
        reverse_proxy localhost:8000 {
            header_up Host {upstream_hostport}
            header_up X-Real-IP {remote_host}
        }
    }

    handle {
        reverse_proxy localhost:3000 {
            header_up X-Forwarded-Proto {scheme}
        }
    }

    # 静的ファイルのキャッシュ
    @static {
        path *.js *.css *.png *.jpg *.ico *.woff2
    }
    header @static Cache-Control "public, max-age=31536000, immutable"

    # アクセスログ
    log {
        output file /var/log/caddy/access.log
        format json
    }
}
# Caddy のインストールと起動
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install caddy

# Caddyfile の構文チェック
caddy validate --config /etc/caddy/Caddyfile

# 設定のリロード(ダウンタイムなし)
caddy reload --config /etc/caddy/Caddyfile

# Caddy Admin API(REST)でランタイムに設定変更
curl http://localhost:2019/config/
curl -X POST http://localhost:2019/config/apps/http/servers/srv0/routes   -H "Content-Type: application/json"   -d '{"match": [{"path": ["/new-service/*"]}], "handle": [{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:9000"}]}]}'

Traefik

2015年に公開されたGo製のモダンリバースプロキシです。GitHubスター52k+。Docker/Kubernetes対応の自動設定が最大の特徴で、コンテナのラベル(traefik.enable=true等)を読んで自動的にルーティングを設定します。Docker Composeやk8s Ingressとの統合が非常にシンプルです。

# docker-compose.yml - Traefik + アプリの自動設定
version: '3.8'
services:
  traefik:
    image: traefik:v3.0
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=admin@yourcompany.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt

  nextjs:
    image: yourapp/nextjs:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextjs.rule=Host(`myapp.yourcompany.com`)"
      - "traefik.http.routers.nextjs.tls=true"
      - "traefik.http.routers.nextjs.tls.certresolver=letsencrypt"
      - "traefik.http.services.nextjs.loadbalancer.server.port=3000"

  fastapi:
    image: yourapp/fastapi:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fastapi.rule=Host(`myapp.yourcompany.com`) && PathPrefix(`/api/v2`)"
      - "traefik.http.routers.fastapi.tls=true"
      - "traefik.http.routers.fastapi.tls.certresolver=letsencrypt"
      - "traefik.http.middlewares.fastapi-strip.stripprefix.prefixes=/api/v2"
      - "traefik.http.routers.fastapi.middlewares=fastapi-strip"
      - "traefik.http.services.fastapi.loadbalancer.server.port=8000"

機能比較表

比較項目NginxCaddyTraefik
自動HTTPS手動(Certbot)✅(組み込み)✅(組み込み)
Docker自動設定✅(最強)
設定のシンプルさ複雑最もシンプル
パフォーマンス最高
静的ファイル配信✅(最高速)限定的
WebSocket
GitHub Stars20k+59k+52k+

リバースプロキシの裏のNext.jsアプリを計装するにはDevOpsカテゴリ/categories/devopsのOpenTelemetryでトレーシングできます。不正アクセスをブロックするにはSecurityカテゴリ/categories/securityのFail2banをNginxのアクセスログと組み合わせてください。

FAQ

Q. Nginx・Caddy・TraefikでどれをVPSに入れるべきですか?

A. 用途による: Nginx: 静的サイト・高トラフィック(月1億リクエスト+)・細かいキャッシュ制御が必要な場合。20年以上の実績で文献が豊富。Caddy: 自動HTTPS重視・個人VPS・スタートアップ・設定ファイルを最小限にしたい場合。CertbotなしでLet's Encrypt証明書を自動取得更新。Traefik: Docker Compose・Kubernetes環境でコンテナが動的に増減する場合。新サービスを追加するたびにNginxの設定を書き直さなくていい。一人でVPSを運用するならCaddyが最も手間が少ない選択肢です。

Q. Caddyの自動HTTPSはワイルドカード証明書(*.example.com)に対応していますか?

A. はい。ただしDNS-01チャレンジが必要です。TLS-01(デフォルト)ではワイルドカードは取得できず、DNSプロバイダーのAPIでTXTレコードを自動設定するDNS-01が必要です。CloudflareのAPIキーを使う例:

# Caddyfile(ワイルドカード証明書)
*.yourcompany.com {
    tls {
        dns cloudflare {env.CLOUDFLARE_API_TOKEN}
    }
    @app host app.yourcompany.com
    handle @app {
        reverse_proxy localhost:3000
    }
    @api host api.yourcompany.com
    handle @api {
        reverse_proxy localhost:8000
    }
}
# xcaddy でDNSプラグインをビルド
xcaddy build --with github.com/caddy-dns/cloudflare
CLOUDFLARE_API_TOKEN=your-token ./caddy run

Q. NginxでWebSocketをリバースプロキシする設定は?

A. WebSocketはHTTPのUpgradeヘッダーが必要です。

location /ws/ {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400s;    # WebSocketは長時間接続を維持する
    proxy_send_timeout 86400s;
}

Next.jsのApp RouterのServer-Sent Events(SSE)やsocket.iowsライブラリを使ったリアルタイム機能にはこの設定が必須です。

Q. TraefikのダッシュボードをHTTPS・認証付きで公開するには?

A. Docker Composeのラベルで設定できます。

traefik:
  labels:
    - "traefik.enable=true"
    # ダッシュボードルーター
    - "traefik.http.routers.dashboard.rule=Host(`traefik.yourcompany.com`)"
    - "traefik.http.routers.dashboard.tls=true"
    - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
    - "traefik.http.routers.dashboard.service=api@internal"
    # Basic認証(htpasswd で生成: htpasswd -nb admin password)
    - "traefik.http.routers.dashboard.middlewares=auth"
    - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxxxx$$hash"
    # IP制限(社内IPのみ)
    - "traefik.http.middlewares.ipallow.ipallowlist.sourcerange=192.168.1.0/24,10.0.0.0/8"

まとめ

ユースケース推奨ツール
高トラフィック・静的配信・細かい制御Nginx
自動HTTPS・シンプルVPS・個人サービスCaddy
Docker Compose・K8s・動的コンテナルーティングTraefik

関連外部リソース

他の記事も読む

Let's Build Together

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

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