caddy-reverse-proxy について
Caddy を Web サーバーおよびリバースプロキシとして設定するためのリファレンススキルです。ルーティング、TLS、Docker の構成、負荷分散、障害調査を扱います。
主な機能
- 01リバースプロキシのルート設定
- 02自動 TLS とワイルドカード TLS の設定
- 03パスやマッチャーによるリクエスト振り分け
- 04負荷分散とヘルスチェックの設定
- 05Docker での Caddy 利用
活用シーン
- 01ドメインからバックエンドサービスへ転送
- 02サブドメインごとにアプリを公開
- 03API パスをサービスへプロキシ
- 04証明書やアップストリームのエラー調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dimdasci/ vps-setup --skill caddy-reverse-proxyインストール後、Claude Code で/caddy-reverse-proxyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/caddyfile-syntax.mddocker-patterns.mdreverse-proxy.mdtls-certificates.mdtroubleshooting.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.md | DNS チャレンジ、ワイルドカード、mTLS |
| docker-patterns.md | Docker 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
公式ドキュメント
コメント
Markdown 対応