Caddy

Go言語で開発された現代的なWebサーバー。自動HTTPS機能により、複雑なSSL証明書管理が不要。ゼロ設定でのSSL対応とHTTP/3先行サポートが特徴。

web-servergohttpsreverse-proxyssltlsmodern

Caddy Web Server

CaddyはGo言語で開発された現代的なWebサーバーで、自動HTTPS機能により複雑なSSL証明書管理を不要にし、ゼロ設定でのSSL対応を実現します。開発者フレンドリーな設計と豊富な機能により、小規模なプロジェクトから大規模な本番環境まで幅広く利用されています。

主な特徴

自動HTTPS(Automatic HTTPS)

  • Let's Encrypt統合: 自動的にSSL証明書を取得・更新
  • ゼロ設定: ドメイン名を指定するだけでHTTPS化
  • 自動リダイレクト: HTTPトラフィックを自動的にHTTPSにリダイレクト
  • セキュアなデフォルト: デフォルトでセキュアな設定

高性能・軽量

  • Go言語実装: ネイティブパフォーマンスと低メモリ使用量
  • HTTP/2/3対応: 最新のHTTPプロトコルをサポート
  • 非同期処理: 高い同時接続数に対応
  • 単一バイナリ: 依存関係のない実行可能ファイル

柔軟な設定

  • Caddyfile: 直感的で読みやすい設定ファイル
  • JSON設定: プログラムによる動的設定が可能
  • REST API: ランタイム設定変更をサポート
  • ゼロダウンタイム再読み込み: 設定変更時のサービス停止なし

インストール方法

Ubuntu/Debian系

# 必要なパッケージをインストール
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

# CaddyのGPGキーを追加
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \
  sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# Caddyリポジトリを追加
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
  sudo tee /etc/apt/sources.list.d/caddy-stable.list

# パッケージリストを更新してCaddyをインストール
sudo apt update
sudo apt install caddy

CentOS/RHEL/Fedora系

# COPRリポジトリを有効化
dnf install 'dnf-command(copr)'
dnf copr enable @caddy/caddy

# Caddyをインストール
dnf install caddy

macOS (Homebrew)

# Homebrewを使用してインストール
brew install caddy

Windows

# Chocolateyを使用
choco install caddy

# Scoopを使用
scoop install caddy

Docker

# 公式Dockerイメージを取得
docker pull caddy

# コンテナで実行
docker run -d --name caddy -p 80:80 -p 443:443 \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -v caddy_data:/data \
  -v caddy_config:/config \
  caddy

バイナリダウンロード

# 最新バイナリを直接ダウンロード(Linux)
curl -OL "https://github.com/caddyserver/caddy/releases/latest/download/caddy_linux_amd64.tar.gz"
tar -xzf caddy_linux_amd64.tar.gz
sudo mv caddy /usr/local/bin/

基本的な使用法

簡単なWebサーバー

# 現在のディレクトリから静的ファイルを配信
caddy file-server --listen :8080

# 特定のドメインでHTTPS配信
caddy file-server --domain example.com

Caddyfileを使用した設定

# 基本的なHTTPS設定
example.com {
    respond "Hello, HTTPS World!"
}

# 静的ファイル配信
example.com {
    root * /var/www/html
    file_server
}

# PHPアプリケーション(WordPressなど)
example.com {
    root * /var/www/wordpress
    encode gzip
    php_fastcgi unix//run/php/php8.2-fpm.sock
    file_server
}

高度な設定

リバースプロキシ設定

# 基本的なリバースプロキシ
api.example.com {
    reverse_proxy localhost:3000
}

# 複数バックエンドでのロードバランシング
app.example.com {
    reverse_proxy backend1:8080 backend2:8080 backend3:8080 {
        lb_policy round_robin
        health_check /health
    }
}

# HTTPSバックエンドへのプロキシ
secure-app.example.com {
    reverse_proxy https://internal-service:8443 {
        transport http {
            tls_insecure_skip_verify
        }
    }
}

認証とセキュリティ

# Basic認証
admin.example.com {
    basicauth {
        admin $2a$14$hGL3...  # bcryptハッシュ
    }
    reverse_proxy localhost:8080
}

# IPアドレス制限
internal.example.com {
    @internal {
        remote_ip 192.168.1.0/24 10.0.0.0/8
    }
    handle @internal {
        reverse_proxy localhost:9000
    }
    respond 403
}

# レート制限
api.example.com {
    rate_limit {
        zone api_zone
        key {remote_host}
        events 100
        window 1m
    }
    reverse_proxy localhost:3000
}

SSL/TLS設定

# カスタム証明書の使用
example.com {
    tls cert.pem key.pem
    file_server
}

# 内部CA証明書(開発用)
dev.local {
    tls internal
    file_server
}

# On-Demand TLS
{
    on_demand_tls {
        ask http://localhost:5555/check
    }
}

https:// {
    tls {
        on_demand
    }
    reverse_proxy localhost:8080
}

Docker Compose設定

version: '3.8'

services:
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"  # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./site:/srv
      - caddy_data:/data
      - caddy_config:/config
    environment:
      - CADDY_INGRESS_NETWORKS=caddy
    networks:
      - caddy

  app:
    image: nginx:alpine
    restart: unless-stopped
    volumes:
      - ./app:/usr/share/nginx/html
    networks:
      - caddy

volumes:
  caddy_data:
    external: true
  caddy_config:

networks:
  caddy:
    external: true

パフォーマンス最適化

キャッシュ設定

example.com {
    # 静的アセットのキャッシュ
    @static {
        path *.css *.js *.png *.jpg *.gif *.ico *.svg
    }
    header @static Cache-Control "public, max-age=31536000"
    
    # 圧縮設定
    encode zstd gzip
    
    root * /var/www/html
    file_server
}

事前圧縮ファイル

example.com {
    root * /var/www/html
    
    # 事前圧縮されたファイルを配信
    file_server {
        precompressed zstd gzip
    }
}

HTTP/3有効化

{
    # グローバルでHTTP/3を有効化
    servers {
        protocol {
            experimental_http3
        }
    }
}

example.com {
    file_server
}

セキュリティ強化

セキュリティヘッダー

example.com {
    # セキュリティヘッダーの設定
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        X-XSS-Protection "1; mode=block"
        Referrer-Policy "strict-origin-when-cross-origin"
        Content-Security-Policy "default-src 'self'"
    }
    
    file_server
}

ファイアウォール統合

# UFWでCaddyポートを開放
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp  # HTTP/3用

監視とログ

アクセスログ設定

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

example.com {
    log {
        output file /var/log/caddy/example.log
    }
    file_server
}

メトリクス監視

{
    admin localhost:2019
}

example.com {
    metrics /metrics
    file_server
}

ヘルスチェック

example.com {
    handle /health {
        respond "OK" 200
    }
    
    reverse_proxy localhost:8080
}

トラブルシューティング

一般的な問題と解決策

  1. 証明書取得エラー
# DNS設定を確認
dig example.com

# ポート80/443の接続性確認
sudo netstat -tlnp | grep :80
sudo netstat -tlnp | grep :443
  1. 設定ファイルの検証
# Caddyfileの構文チェック
caddy validate

# 設定のテスト実行
caddy run --config Caddyfile
  1. 詳細ログの有効化
{
    debug
    log {
        level DEBUG
    }
}

パフォーマンスデバッグ

# プロファイリング有効化
caddy run --config Caddyfile --debug

# メモリ使用量監視
curl http://localhost:2019/debug/pprof/heap

プラグインとカスタマイズ

xCaddyによるカスタムビルド

# xCaddyをインストール
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

# プラグイン付きでビルド
xcaddy build \
    --with github.com/caddy-dns/cloudflare \
    --with github.com/caddyserver/cache-handler

人気のプラグイン

  • caddy-dns/cloudflare: CloudFlare DNS統合
  • caddyserver/cache-handler: HTTPキャッシュ
  • caddyserver/replace-response: レスポンス書き換え
  • caddy-dns/route53: AWS Route53統合

本番環境での運用

systemdサービス設定

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=1048576
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

バックアップ戦略

# 証明書データのバックアップ
sudo tar -czf caddy-backup-$(date +%Y%m%d).tar.gz \
  /var/lib/caddy \
  /etc/caddy

まとめ

Caddyは現代的なWebサーバーとして、自動HTTPS、直感的な設定、高性能を実現しています。特に:

  • 開発効率: ゼロ設定でのHTTPS化により開発時間を短縮
  • 運用性: 自動証明書管理により運用負荷を軽減
  • 拡張性: プラグインシステムによる柔軟なカスタマイズ
  • セキュリティ: デフォルトでセキュアな設定

小規模な個人プロジェクトから大規模な本番環境まで、幅広い用途で活用できる優秀なWebサーバーです。