SSL証明書・Go言語開発・Linuxサーバー構築・セキュリティ
執筆:株式会社エスロジカル(Webシステム受託開発・インフラ構築・運用改善)
Nginx をリバースプロキシとして使う構成は、現代の Web インフラではほぼ標準です。
しかし「とりあえず proxy_pass を書いた」だけでは、タイムアウト・ヘッダー漏れ・キャッシュの誤動作など
本番特有の問題が起きやすくなります。
本記事では、リバースプロキシ設計で押さえるべき実務上の判断基準をまとめます。
Nginx をリバースプロキシとして前段に置く主な目的は次の通りです。
| パターン | 構成 | 向いているケース |
|---|---|---|
| シンプル1段 | インターネット → Nginx(SSL終端)→ アプリ(HTTP) | 単一サーバー・小規模 |
| マルチバックエンド | Nginx → 複数バックエンド(パスベースのルーティング) | マイクロサービス・API ゲートウェイ的な用途 |
| ロードバランシング | Nginx(upstream)→ 複数の同一アプリサーバー | 水平スケールアウト・高可用性 |
| 2段プロキシ | CDN / ALB → Nginx → アプリ | クラウド構成・DDoS 対策 |
リバースプロキシが SSL を終端し、バックエンドとの通信は HTTP にする設計が一般的です。 バックエンドが同じサーバー内にある場合は特に問題ありませんが、 異なるサーバー間の通信(例:マネージド DB)は別途暗号化を検討します。
ssl_protocols TLSv1.2 TLSv1.3;)ssl_ciphers で明示指定)Strict-Transport-Security: max-age=31536000)
証明書は Let's Encrypt でも有料証明書でも Nginx に設定できます。
企業サイト・EC サイトでは OV 以上の有料証明書を推奨します。
SSL証明書の一覧・購入はこちら /
CSR 作成・Apache/Nginx へのインストール手順 /
SSL証明書 FAQ
リバースプロキシを経由すると、バックエンドから見たクライアント IP が Nginx のアドレスになってしまいます。 アクセスログ・不正アクセス検知・地域制限などを正しく動作させるために以下のヘッダーを設定します。
| 設定 | 目的 |
|---|---|
| proxy_set_header X-Real-IP $remote_addr; | 実際のクライアント IP をバックエンドに転送 |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | プロキシチェーンを含む IP 一覧を転送 |
| proxy_set_header X-Forwarded-Proto $scheme; | クライアントが HTTPS で接続したことをバックエンドに通知(リダイレクトループ防止) |
| proxy_set_header Host $host; | バーチャルホスト判定のためにオリジナルの Host ヘッダーを転送 |
注意:X-Forwarded-For はクライアント側から偽装できます。 信頼できるプロキシからのみこのヘッダーを受け付けるよう、バックエンドアプリ側でも適切に処理してください。
デフォルト値のままでは、ファイルアップロードや時間のかかる API 処理で問題が起きやすくなります。
client_max_body_size 50m;)。proxy_buffering off;)します。Cache-Control: no-cache, no-store を設定する。error_page 502 503 504 でメンテナンスページを返す。デフォルトの Nginx エラーページはユーザー体験が悪い。proxy_next_upstream error timeout で自動的に次のサーバーへフォールオーバーする。server_tokens off;)