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"
機能比較表
| 比較項目 | Nginx | Caddy | Traefik |
|---|---|---|---|
| 自動HTTPS | 手動(Certbot) | ✅(組み込み) | ✅(組み込み) |
| Docker自動設定 | ❌ | ✅ | ✅(最強) |
| 設定のシンプルさ | 複雑 | 最もシンプル | 中 |
| パフォーマンス | 最高 | 高 | 高 |
| 静的ファイル配信 | ✅(最高速) | ✅ | 限定的 |
| WebSocket | ✅ | ✅ | ✅ |
| GitHub Stars | 20k+ | 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.io、wsライブラリを使ったリアルタイム機能にはこの設定が必須です。
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 |