Nginx リバースプロキシの設定

Nginxをリバースプロキシサーバーとして構成し、クライアントのリクエストをバックエンドアプリケーションサーバーに転送する方法を解説します。完全なステップバイステップガイド。

Proxy

詳細な説明

リバースプロキシはクライアントとバックエンドサーバーの間に位置し、クライアントに代わってリクエストを転送します。Nginxはイベント駆動アーキテクチャと低メモリフットプリントにより、この役割に最適です。

基本設定

中心となるディレクティブは proxy_pass で、Nginxに受信リクエストの転送先を指示します。server ブロック内の location ブロックに配置します。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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_set_header ディレクティブで、元のホスト名、IPアドレス、プロトコルを渡すことでこの問題を解決します。これらのヘッダーがないと、バックエンドはすべてのリクエストがローカルの 127.0.0.1 から来ているように認識し、実際のクライアントIPのログ記録やIPベースのセキュリティルールの適用が不可能になります。

X-Forwarded-For ヘッダーはリクエストが経由した全プロキシのチェーンを構築します。X-Forwarded-Proto ヘッダーは元のプロトコルを保持し、NginxでSSLを終端している場合でもアプリケーションが正しく絶対URLを生成しHTTPSリダイレクトを適用できるようにします。

バッファリングとタイムアウト

Nginxはデフォルトでバックエンドからのレスポンスをバッファリングし、低速クライアントに対するパフォーマンスを向上させます。proxy_bufferingproxy_buffer_sizeproxy_buffers でこの動作を調整できます。proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout などのタイムアウトディレクティブは接続の無期限保持を防止します。

エラーハンドリング

proxy_intercept_errors onerror_page ディレクティブを組み合わせて、バックエンドが5xxエラーを返した際にカスタムエラーページを提供できます。これにより障害時のユーザー体験が向上し、内部のスタックトレースやデバッグ情報の漏洩を防ぎます。

ベストプラクティス

  • バックエンドがリクエストされた仮想ホストを識別できるよう、必ず Host ヘッダーを設定する。
  • NginxでSSLを終端している場合でもバックエンドがHTTPSを検知できるよう X-Forwarded-Proto を使用する。
  • 別のバックエンドサーバーへの自動リトライのため proxy_next_upstream の追加を検討する。
  • アイドル接続によるサーバーリソース消費を防ぐため、適切なタイムアウトを設定する。
  • $upstream_response_time ログ変数でアップストリームの応答時間を監視し、遅延がエンドユーザーに影響する前に検知する。

ユースケース

Node.jsやPythonのWebアプリケーションをNginxの背後にデプロイし、SSL終端、静的アセットの効率的な配信、バックエンドの直接露出からの保護を行います。

Try It — Nginx Config Generator

フルツールを開く