mcpField
C
caddy-reverse-proxy

caddy-reverse-proxy

github.com/dimdasciクラウド・DevOps0149 回インストール42 週間前に更新
リポジトリ

caddy-reverse-proxy について

Caddy を Web サーバーおよびリバースプロキシとして設定するためのリファレンススキルです。ルーティング、TLS、Docker の構成、負荷分散、障害調査を扱います。

主な機能

  1. 01リバースプロキシのルート設定
  2. 02自動 TLS とワイルドカード TLS の設定
  3. 03パスやマッチャーによるリクエスト振り分け
  4. 04負荷分散とヘルスチェックの設定
  5. 05Docker での Caddy 利用

活用シーン

  1. 01ドメインからバックエンドサービスへ転送
  2. 02サブドメインごとにアプリを公開
  3. 03API パスをサービスへプロキシ
  4. 04証明書やアップストリームのエラー調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dimdasci/vps-setup --skill caddy-reverse-proxy

インストール後、Claude Code で/caddy-reverse-proxyを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
caddyfile-syntax.md
docker-patterns.md
reverse-proxy.md
tls-certificates.md
troubleshooting.md

詳細

Caddy リバースプロキシ

Caddy は HTTPS を自動化するウェブサーバーです。証明書の取得と更新、HTTP から HTTPS へのリダイレクトを自動で行い、シンプルな設定構文を備えています。

クイックリファレンス

タスク構文
基本的なプロキシreverse_proxy backend:8080
複数のアップストリームreverse_proxy node1:80 node2:80
パスルーティングhandle /api/* { reverse_proxy api:8080 }
パスプレフィックスの削除handle_path /api/* { reverse_proxy api:8080 }
リクエストヘッダーの設定header_up Host localhost
レスポンスヘッダーの削除header_down -Server
ワイルドカード証明書tls { dns cloudflare {env.CF_API_TOKEN} }
設定の再読み込みcaddy reload --config /etc/caddy/Caddyfile

基本パターン

シンプルなリバースプロキシ
example.com {
    reverse_proxy backend:8080
}
複数のサイト
app.example.com {
    reverse_proxy app:3000
}

api.example.com {
    reverse_proxy api:8080
}
パスベースのルーティング
example.com {
    handle /api/* {
        reverse_proxy api:8080
    }
    handle {
        reverse_proxy frontend:3000
    }
}
パスプレフィックスの削除
example.com {
    handle_path /api/* {
        reverse_proxy api:8080  # /api/users → /users
    }
}

ヘッダーの操作

example.com {
    reverse_proxy backend:8080 {
        # Set Host header (required by some backends)
        header_up Host localhost

        # Add client IP
        header_up X-Real-IP {remote_host}

        # Remove sensitive header
        header_up -Authorization

        # Remove server identity from response
        header_down -Server
    }
}

Docker との統合

コンテナへのプロキシ(同じネットワーク)
# docker-compose.yml
services:
  caddy:
    image: caddy:2-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    networks:
      - web

  app:
    image: myapp
    networks:
      - web
    expose:
      - "8080"
# Caddyfile - use container name as hostname
example.com {
    reverse_proxy app:8080
}
ホストのサービスへのプロキシ
services:
  caddy:
    extra_hosts:
      - "host.docker.internal:host-gateway"
example.com {
    reverse_proxy host.docker.internal:8080
}

TLS の設定

自動(デフォルト)

Caddy は次の場合に証明書を自動で取得します。

  • ドメインの DNS がサーバーを指している
  • ポート 80/443 にアクセスできる
ワイルドカード証明書

DNS プロバイダープラグインが必要です。

*.example.com {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }

    @app1 host app1.example.com
    handle @app1 {
        reverse_proxy app1:8080
    }

    @app2 host app2.example.com
    handle @app2 {
        reverse_proxy app2:8080
    }
}
内部/開発用
localhost {
    tls internal
    reverse_proxy app:8080
}

リクエストマッチャー

# Path matching
@api path /api/*

# Header matching
@websocket header Connection *Upgrade*

# Method matching
@post method POST

# Combined (AND logic)
@api_post {
    path /api/*
    method POST
}

# Use matcher
handle @api {
    reverse_proxy api:8080
}

負荷分散

example.com {
    reverse_proxy node1:80 node2:80 node3:80 {
        lb_policy round_robin
        health_uri /health
        health_interval 30s
    }
}

一般的な設定

セキュリティヘッダー
(security) {
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
        Referrer-Policy strict-origin-when-cross-origin
    }
}

example.com {
    import security
    reverse_proxy backend:8080
}
www へのリダイレクト
www.example.com {
    redir https://example.com{uri} permanent
}
SPA(シングルページアプリ)
example.com {
    root * /srv
    try_files {path} /index.html
    file_server
}
gRPC/HTTP/2 クリアテキスト
example.com {
    reverse_proxy h2c://grpc-server:9000
}

グローバルオプション

{
    email [email protected]

    # Use staging for testing
    # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

example.com {
    # site config
}

参考ファイル

ファイル参照するタイミング
reverse-proxy.md負荷分散、ヘルスチェック、トランスポートオプション
caddyfile-syntax.mdマッチャー、handle ブロック、ディレクティブ
tls-certificates.mdDNS チャレンジ、ワイルドカード、mTLS
docker-patterns.mdDocker Compose、ネットワーク、ホストへのアクセス
troubleshooting.mdよくあるエラーと診断

よくある問題

問題解決策
"no upstreams available"バックエンドが稼働しているか、同じ Docker ネットワーク上にあるか確認します
"connection refused"バックエンドが 127.0.0.1 ではなく 0.0.0.0 にバインドされているか確認します
証明書が取得されないDNS がサーバーを指しているか、ポート 80/443 が開いているか確認します
403 Forbiddenバックエンドには header_up Host localhost が必要です
WebSocket が失敗する通常は動作します。SSE の場合は flush_interval -1 を確認します

検証コマンド

# Validate config
caddy validate --config /etc/caddy/Caddyfile

# Format config
caddy fmt --overwrite /etc/caddy/Caddyfile

# Reload (zero-downtime)
caddy reload --config /etc/caddy/Caddyfile

# Debug mode
# Add to global options: { debug }

# Check certificate
openssl s_client -connect example.com:443 -servername example.com

公式ドキュメント

トピックURL
Caddyfilehttps://caddyserver.com/docs/caddyfile
reverse_proxyhttps://caddyserver.com/docs/caddyfile/directives/reverse_proxy
自動 HTTPShttps://caddyserver.com/docs/automatic-https
一般的なパターンhttps://caddyserver.com/docs/caddyfile/patterns

コメント