オープンソースエッジプロキシ比較:Nginx vs Caddy vs Traefik でリバースプロキシをセルフホストする
オープンソースラボ編集部 ・ 2026年6月13日
オープンソースエッジプロキシ比較:Nginx vs Caddy vs Traefik でリバースプロキシをセルフホストする
Webアプリのフロントに立つリバースプロキシ・エッジサーバーを適切に選択することは、パフォーマンス・TLS管理・ルーティングの設計に直結します。Nginx・Caddy・TraefikはオープンソースのHTTPサーバー/プロキシとして広く使われています。
リバースプロキシの役割
- TLS終端: HTTPSの証明書管理・Let's Encrypt自動更新
- ロードバランシング: 複数バックエンドへのトラフィック分散
- 静的ファイル配信: CDN前段の高速ファイル配信
- レートリミット: APIへの過剰リクエストをブロック
- 認証プロキシ: Basic Auth・OAuth2プロキシ
主要ツールの概要
Nginx
最も広く使われているHTTPサーバー兼リバースプロキシです。高いパフォーマンスと成熟した設定体系を持ち、静的ファイル配信・リバースプロキシ・ロードバランサーとして機能します。
# /etc/nginx/conf.d/myapp.conf
upstream backend {
least_conn;
server app-1:3000 weight=1;
server app-2:3000 weight=1;
server app-3:3000 weight=1;
keepalive 32;
}
server {
listen 80;
server_name myapp.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name myapp.example.com;
ssl_certificate /etc/ssl/certs/myapp.crt;
ssl_certificate_key /etc/ssl/private/myapp.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# レートリミット
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location / {
proxy_pass http://backend;
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_cache_bypass $http_upgrade;
}
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
location /static/ {
alias /var/www/static/;
expires 1y;
add_header Cache-Control "public, immutable";
gzip_static on;
}
}
Caddy
設定がシンプルでLet's Encrypt証明書を自動管理する現代的なWebサーバーです。Caddyfileという直感的な設定構文が特徴です。
# Caddyfile
myapp.example.com {
# Let's Encrypt証明書を自動取得・更新
tls {
protocols tls1.2 tls1.3
}
# リバースプロキシ(ロードバランシング)
reverse_proxy / {
to app-1:3000 app-2:3000 app-3:3000
lb_policy least_conn
health_uri /health
health_interval 10s
health_timeout 5s
}
# 静的ファイル配信
handle /static/* {
root * /var/www
file_server {
precompressed gzip br
}
}
# レートリミット(caddy-ratelimit plugin)
rate_limit {
zone dynamic {
key {remote_host}
events 100
window 1m
}
}
# ヘッダー設定
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Frame-Options DENY
X-Content-Type-Options nosniff
}
log {
output file /var/log/caddy/access.log
format json
}
}
# Admin API
:2019 {
admin
}
Traefik
DockerやKubernetesと深く統合された動的プロキシです。コンテナのラベルやKubernetesのIngressリソースを読んで自動的にルーティングを設定します。
# docker-compose.yml
services:
traefik:
image: traefik:v3.0
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.email=admin@example.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
- "--api.dashboard=true"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
myapp:
image: myapp:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)"
- "traefik.http.routers.myapp.tls.certresolver=myresolver"
- "traefik.http.services.myapp.loadbalancer.server.port=3000"
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
機能比較表
| 比較項目 | Nginx | Caddy | Traefik |
|---|---|---|---|
| TLS自動更新(Let's Encrypt) | ⚠️ certbot | ✅ ネイティブ | ✅ ネイティブ |
| 設定の容易さ | ★★☆☆☆ | ★★★★★ | ★★★★☆ |
| Docker統合 | ⚠️ 手動 | ✅ | ✅ 自動 |
| Kubernetes Ingress | ✅ ingress-nginx | ✅ | ✅ IngressRoute |
| パフォーマンス | ★★★★★ | ★★★★☆ | ★★★★☆ |
| 静的ファイル配信 | ★★★★★ | ★★★★☆ | ❌ |
| ロードバランシング | ✅ | ✅ | ✅ |
| HTTPSリダイレクト | 手動設定 | 自動 | 自動 |
| 動的設定(再起動不要) | ❌ | ✅ | ✅ |
| プラグインエコシステム | ✅ モジュール | ✅ | ✅ |
| リソース使用量 | 最小 | 小 | 中 |
| ライセンス | BSD-2 | Apache 2.0 | MIT |
| GitHub Stars | 21k+ | 57k+ | 50k+ |
NginxにLet's Encryptを設定する
# Certbotでlet's encrypt証明書を自動取得
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d myapp.example.com
# 自動更新cronの確認
sudo certbot renew --dry-run
# nginx設定のテスト
sudo nginx -t
sudo systemctl reload nginx
DevOps・インフラツールはDevOpsカテゴリ(/categories/devops)で一覧でき、セキュリティ関連のプロキシ設定はセキュリティカテゴリ(/categories/security)でも参照できます。
FAQ
Q. NginxとApache HTTPdはどちらを選ぶべきですか?
A. 現代のWebアプリには通常Nginxを推奨します。Nginxはイベント駆動型で非同期処理するため、高い同時接続数でもメモリ使用量が安定しています。ApacheはモジュールによるPHP実行(mod_php)が必要な場合や、.htaccessでディレクトリごとの設定が必要な場合に選ばれますが、新規プロジェクトではNginxが主流です。
Q. CaddyのTLS自動更新の仕組みを教えてください。
A. CaddyはACMEプロトコル(Let's Encrypt等)を内蔵しており、設定ファイルにドメイン名を書くだけで証明書の取得・更新・更新前の検証をすべて自動で行います。証明書はデフォルトで~/.local/share/caddy/(Linuxの場合)に保存されます。HTTP-01チャレンジ(ポート80必要)またはDNS-01チャレンジ(ワイルドカード証明書対応)を使います。
Q. TraefikはNginx Ingressと比べてどうですか?
A. KubernetesのIngress Controllerとして比較すると、Nginx Ingressは安定性と実績で優れ、ほぼすべてのKubernetesクラスターで動作します。TraefikはDashboard・ミドルウェアの柔軟さ・Let's Encrypt統合が優れ、設定がKubernetes CustomResourceとして宣言的に書けます。小規模クラスターではTraefik、大規模本番環境ではNginx Ingressが選ばれることが多いです。
Q. DockerでCaddyを使うメリットは何ですか?
A. CaddyはDockerコンテナでも証明書を永続化でき(ボリュームをマウント)、設定ファイルを変更するだけで証明書管理・HTTPSリダイレクトが自動的に機能します。Certbot+Nginxのように複数ツールを組み合わせる必要がなく、設定ミスが減ります。マルチドメインの場合でもCaddyfileに1行追加するだけで対応できます。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 高トラフィック静的ファイル配信 | Nginx |
| 自動TLS・シンプル設定 | Caddy |
| DockerコンテナのAutoDiscovery | Traefik |
| Kubernetes Ingress Controller | nginx-ingress / Traefik |