AI

リバースプロキシ比較: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

機能比較表

比較項目NPMCaddyHAProxy
GUI管理✅ Web UI△ 統計のみ
自動HTTPS✅ デフォルト△(Certbot連携必要)
設定の簡単さ✅ GUI✅ 最少
最大パフォーマンス✅ 最高
GitHub Stars24k+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.comexample.comを両方入力③Use a DNS Challenge: ✅→DNSプロバイダーにCloudflareを選択④Cloudflare API Token: ゾーン:読み取りDNS:編集権限のトークンを入力⑤Save→自動取得(2〜3分)。Proxy Hostsでこのワイルドカード証明書を選択→app.example.comapi.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-tablestick 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. ホームラボ・セルフホスト・非エンジニアが管理するならNPMDockerコンテナ・最小設定・自動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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。