リバースプロキシ比較:Nginx Proxy Manager vs Caddy vs HAProxy でプロキシを管理する
オープンソースラボ編集部 ・ 2026年6月14日
リバースプロキシ比較:Nginx Proxy Manager vs Caddy vs HAProxy でプロキシを管理する
Webサービスのフロントエンドに置いてHTTPS終端・負荷分散・サブドメインルーティングを担うリバースプロキシは、セルフホストインフラの必須コンポーネントです。Nginx Proxy Manager(GUI付きNginx・Let's Encrypt自動化・Docker最適)・Caddy(Go製・自動HTTPS・設定ファイル最小)・HAProxy(最高性能・TCP/HTTP・L4/L7負荷分散)の3つが2026年のOSSリバースプロキシ主要選択肢です。
リバースプロキシを使う理由
- HTTPS終端: Let's Encryptで無料SSL証明書を自動取得・更新してすべてのサービスをHTTPS化
- サブドメインルーティング:
api.example.com→バックエンドコンテナ、app.example.com→フロントエンドに転送 - 負荷分散: 複数のバックエンドサーバーにトラフィックを分散してスケールアウト
- WAF・レート制限: 不正アクセス・DDoSをプロキシ層でブロック
主要ツールの概要
Nginx Proxy Manager
2019年公開、Node.js製のOSSです。GitHubスター24k+。ブラウザGUIからNginxのプロキシホスト・SSL証明書・アクセスリストを管理できるNginxフロントエンドで、Let's Encryptの自動取得・更新・DNSチャレンジをクリック操作で設定できます。Dockerで動作するホームラボ・セルフホスト向けの人気ツールです。
# docker-compose.yml: Nginx Proxy Manager
version: "3.8"
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80" # HTTP
- "443:443" # HTTPS
- "81:81" # Admin UI
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
environment:
DB_MYSQL_HOST: npm-db
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: npm
DB_MYSQL_PASSWORD: ${DB_PASS}
DB_MYSQL_NAME: npm
depends_on: [npm-db]
npm-db:
image: jc21/mariadb-aria:latest
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
MYSQL_DATABASE: npm
MYSQL_USER: npm
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- npm_db:/var/lib/mysql
volumes:
npm_data:
npm_letsencrypt:
npm_db:
# Python: NPM REST APIでプロキシホストを自動作成(Webアプリデプロイ自動化)
import requests
NPM_URL = 'http://localhost:81'
def npm_login(email: str, password: str) -> str:
'''NPM APIのJWTトークンを取得'''
resp = requests.post(f'{NPM_URL}/api/tokens', json={
'identity': email,
'secret': password,
})
return resp.json()['token']
def create_proxy_host(token: str, domain: str, forward_host: str, forward_port: int,
ssl_enabled: bool = True) -> dict:
'''NPMにプロキシホストをAPIで作成(新サービスデプロイ時の自動設定)'''
payload = {
'domain_names': [domain],
'forward_scheme': 'http',
'forward_host': forward_host,
'forward_port': forward_port,
'block_exploits': True,
'allow_websocket_upgrade': True,
'ssl_forced': ssl_enabled,
'certificate_id': 'new' if ssl_enabled else 0,
'meta': {
'letsencrypt_agree': True,
'dns_challenge': False,
} if ssl_enabled else {},
}
resp = requests.post(
f'{NPM_URL}/api/nginx/proxy-hosts',
json=payload,
headers={'Authorization': f'Bearer {token}'},
)
return resp.json()
# 使用例:新しいマイクロサービスをデプロイしたらプロキシを自動設定
def deploy_service(service_name: str, container_port: int) -> dict:
token = npm_login('admin@example.com', 'password')
return create_proxy_host(
token=token,
domain=f'{service_name}.example.com',
forward_host=f'{service_name}', # Docker コンテナ名
forward_port=container_port,
)
Caddy
2015年公開、Go製のOSSです。GitHubスター59k+。自動HTTPS(Let's Encrypt自動取得・更新)をデフォルトで有効にした次世代Webサーバー/リバースプロキシで、シンプルなCaddyfileで設定できます。HTTP/3(QUIC)・自動TLS・On-demand TLS・OTelメトリクスを標準サポートします。
# docker-compose.yml: Caddy
version: "3.8"
services:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3 (QUIC)
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data # 証明書・キーを永続化
- caddy_config:/config
environment:
CLOUDFLARE_API_TOKEN: ${CF_API_TOKEN} # DNSチャレンジ用(ワイルドカード証明書)
volumes:
caddy_data:
caddy_config:
# Caddyfile: シンプルなリバースプロキシ設定(自動HTTPS)
# 基本的なリバースプロキシ(3行で完結)
app.example.com {
reverse_proxy app:3000
}
# API サーバー(レート制限・ヘッダー追加)
api.example.com {
reverse_proxy api:8080 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
lb_policy round_robin
to api1:8080 api2:8080 api3:8080
}
rate_limit {
zone api_limit {
key {remote_host}
events 100
window 1m
}
}
}
# 静的ファイル配信
static.example.com {
root * /var/www/static
file_server browse
encode gzip zstd
header Cache-Control "public, max-age=31536000, immutable"
}
# ワイルドカードTLS(*.example.comすべてに証明書)
*.example.com {
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
@app host app.example.com
handle @app {
reverse_proxy app:3000
}
@api host api.example.com
handle @api {
reverse_proxy api:8080
}
}
HAProxy
1999年公開、C製のOSSです。GitHubスター5k+。最高性能のTCP/HTTP負荷分散エンジンで、L4(TCP)・L7(HTTP)負荷分散・ヘルスチェック・セッション持続・ACL(アクセス制御)・統計ダッシュボードが統合されています。毎秒数十万リクエストを処理する大規模Webサービスでの採用実績があります。
# docker-compose.yml: HAProxy + Let's Encrypt (Certbot)
version: "3.8"
services:
haproxy:
image: haproxy:2.9-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8404:8404" # 統計ダッシュボード
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
- ./certs:/etc/haproxy/certs:ro
cap_add:
- NET_BIND_SERVICE
volumes: {}
# haproxy.cfg: L7 HTTP負荷分散設定
global
maxconn 50000
log stdout format raw local0 info
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-ciphers ECDHE+AESGCM:ECDHE+CHACHA20
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
option httplog
option forwardfor
option http-server-close
retries 3
# 統計ダッシュボード
frontend stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:${STATS_PASS}
# HTTPS フロントエンド
frontend https_frontend
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1
option http-server-close
# SNIベースルーティング
use_backend app_backend if { hdr(host) -i app.example.com }
use_backend api_backend if { hdr(host) -i api.example.com }
default_backend app_backend
backend app_backend
balance roundrobin
option httpchk GET /health HTTP/1.1
Host:\ app.example.com
server app1 app1:3000 check inter 10s
server app2 app2:3000 check inter 10s
server app3 app3:3000 check inter 10s backup # バックアップサーバー
backend api_backend
balance leastconn # 最小接続数に転送
option httpchk GET /api/health
server api1 api1:8080 check
server api2 api2:8080 check
機能比較表
| 比較項目 | NPM | Caddy | HAProxy |
|---|---|---|---|
| GUI管理 | ✅ Web UI | ❌ | △ 統計のみ |
| 自動HTTPS | ✅ | ✅ デフォルト | △(Certbot連携必要) |
| 設定の簡単さ | ✅ GUI | ✅ 最少 | 中 |
| 最大パフォーマンス | 中 | 高 | ✅ 最高 |
| GitHub Stars | 24k+ | 59k+ | 5k+ |
リバースプロキシはDevOpsカテゴリ/categories/devopsのコンテナオーケストレーション(Kubernetes)とServiceメッシュ(Istio/Linkerd)と組み合わせて外部トラフィックをIngress Controllerで受け付けて内部サービスメッシュにルーティングする2層プロキシアーキテクチャを構築します。セキュリティカテゴリ/categories/securityのWAF・レート制限・mTLS設定と統合してCaddyやNginxをゼロトラストネットワークのエントリポイントとして機能させます。
FAQ
Q. Nginx Proxy ManagerでWildcard TLS証明書(*.example.com)をDNSチャレンジで取得するには?
A. NPMのSSL設定でDNSチャレンジを有効化してCloudflare/Route53のAPIトークンを設定するとワイルドカード証明書を自動取得できます。設定: ①NPM Console→SSL Certificates→Add Certificate→Let's Encrypt②Domain Names: *.example.comとexample.comを両方入力③Use a DNS Challenge: ✅→DNSプロバイダーにCloudflareを選択④Cloudflare API Token: ゾーン:読み取り・DNS:編集権限のトークンを入力⑤Save→自動取得(2〜3分)。Proxy Hostsでこのワイルドカード証明書を選択→app.example.com・api.example.comすべてに同一証明書を適用→証明書の更新も自動。環境変数: CERTBOT_DNS_CLOUDFLARE_PROPAGATION_SECONDS=60で証明書取得のDNS伝播待ち時間を調整。
Q. CaddyでHTTP/3(QUIC)を有効化してWebサイトを高速化するには?
A. CaddyはHTTP/3がデフォルトで有効になっており、443/udpポートを公開するだけでQUICが使えます。確認: docker-compose.ymlで- "443:443/udp"をポートに追加→Caddyが自動でHTTP/3対応。動作確認: curl --http3 https://app.example.comまたはブラウザのDevToolsでProtocolがh3になっていることを確認。CDN連携: Cloudflareプロキシ経由の場合はCloudflare→Caddy間はHTTP/2(Cloudflare Flexible SSL)→エンドユーザー←CloudflareはHTTP/3→Cloudflareの設定でHTTP/3を有効化。パフォーマンス: QUICは0-RTTハンドシェイク対応→TCPの3-wayハンドシェイク+TLS1.3より接続確立が50ms〜100ms高速→モバイルネットワークでの体感速度向上。
Q. HAProxyで「スティッキーセッション」を設定してユーザーを同じバックエンドに固定するには?
A. HAProxyのstick-tableとstick onを使ってクッキーまたはIPアドレスベースのセッション固定を設定します。クッキーベース(推奨): backend app_backend { cookie SERVERID insert indirect nocache; server app1 app1:3000 check cookie app1; server app2 app2:3000 check cookie app2 }→HAProxyがSERVERIDクッキーを付与→次のリクエストで同じサーバーに固定。IPベース: stick-table type ip size 200k expire 30m; stick on src→クライアントIPでハッシュしてサーバー固定→NAT環境では不正確。セッション同期(複数HAProxy): peers mypeers { peer haproxy1 10.0.0.1:1024; peer haproxy2 10.0.0.2:1024 }で複数HAProxyノードのスティックテーブルを同期→HA構成でも正確なセッション固定。
Q. NPM・Caddy・HAProxyをどう使い分けるべきですか?
A. ホームラボ・セルフホスト・非エンジニアが管理するならNPM、Dockerコンテナ・最小設定・自動HTTPS・Go製ならCaddy、大規模トラフィック・最高パフォーマンス・L4/L7負荷分散・金融/Eコマースの本番ならHAProxyが向いています。NPM優位: ①ブラウザGUIで誰でも設定可能→エンジニアなしで証明書・プロキシを管理②Dockerのホームラボに最適③Let's Encrypt HTTP/DNSチャレンジ両方対応④アクセスリスト(Basic Auth・IPホワイトリスト)をGUIで設定。Caddy優位: ①59kスター・最大のコミュニティ②Caddyfile設定が最もシンプル→10行以下でHTTPSリバースプロキシ完成③HTTP/3標準サポート④Go製→シングルバイナリ・低メモリ使用量。HAProxy優位: ①C製の最高パフォーマンス→1コアで50,000+ req/sを処理②L4 TCPモード→非HTTP(MySQL・Kafka・WebSocket)の負荷分散③高度なACL(URLパス・ヘッダー・クッキーによる条件分岐)④詳細な統計・メトリクスダッシュボード→ProxyメトリクスをPrometheusへエクスポート可能。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| ホームラボ・GUI管理・非エンジニア | Nginx Proxy Manager |
| Docker・最小設定・自動HTTPS・中小規模 | Caddy |
| 大規模・最高性能・L4/L7・本番環境 | HAProxy |