はじめに:Nginxリバースプロキシとは?

リバースプロキシとは、クライアントからのリクエストを一度受け取り、そのリクエストを背後にある適切なサーバーに転送する仕組みです。これにより、負荷分散(ロードバランシング)、SSL終端、セキュリティの向上、キャッシュによる高速化など、多くのメリットが得られます。

Nginxは、その軽量さ、高いパフォーマンス、そして柔軟な設定が可能なことから、リバースプロキシサーバーとして世界中で広く採用されています。この記事では、Nginxを使ってリバースプロキシを構築するための基本的な設定から、より実践的な応用例までをステップバイステップで解説していきます。

リバースプロキシの基本設定:proxy_pass

Nginxでリバースプロキシを構成する最も基本的なディレクティブがproxy_passです。これは、特定のリクエストをどのバックエンドサーバーに転送するかを指定します。設定は通常、/etc/nginx/sites-available/内の設定ファイルに記述します。

例えば、ポート80で受け付けたリクエストを、ローカルのポート3000で動作しているアプリケーション(例: Node.jsやPythonのWebアプリ)に転送する場合、以下のようにserverブロック内にlocationブロックを定義します。この設定により、example.comへのすべてのリクエスト(location /)が内部のアプリケーションに中継されます。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
    }
}

重要!クライアント情報をバックエンドに渡す設定

リバースプロキシを介すると、バックエンドサーバーから見ると、すべてのリクエストの送信元がNginxサーバーのIPアドレスになってしまいます。これでは、アクセスログの分析やIPアドレスに基づいた制御が正しく行えません。

この問題を解決するため、proxy_set_headerディレクティブを使って、元のクライアント情報をHTTPヘッダーに含めてバックエンドに転送することが不可欠です。最低限、以下のヘッダーを設定することが推奨されます。

  • Host: オリジナルのホスト名を渡します。
  • X-Real-IP: クライアントの実際のIPアドレスを渡します。
  • X-Forwarded-For: 経由したプロキシサーバーのリストを追加します。
  • X-Forwarded-Proto: オリジナルのプロトコル(httpまたはhttps)を渡します。
location / {
    proxy_pass http://localhost: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;
}

SSL/TLS終端でサイトをHTTPS化する

リバースプロキシの一般的な活用例として、SSL/TLS終端があります。これは、Nginxがクライアントとの間でHTTPS通信を行い、暗号化・復号処理を一手に引き受ける構成です。Nginxとバックエンドサーバー間は、信頼できる内部ネットワークであれば平文のHTTPで通信できます。

これにより、バックエンドの各アプリケーションサーバーで個別にSSL証明書を管理する手間が省け、証明書の更新もNginxサーバー1台で済むため、運用が大幅に簡略化されます。設定には、listen 443 ssl;ディレクティブと、ssl_certificateおよびssl_certificate_keyディレクティブで証明書ファイルのパスを指定します。

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /path/to/your/fullchain.pem;
    ssl_certificate_key /path/to/your/privkey.pem;

    location / {
        proxy_pass http://localhost: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;
    }
}

【応用編】upstreamで負荷分散を実現する

アクセスが増加し、1台のバックエンドサーバーでは処理が追いつかなくなった場合、upstreamブロックを使って負荷分散(ロードバランシング)を構成できます。これにより、複数のバックエンドサーバーにリクエストを振り分け、システムの可用性とスケーラビリティを向上させることができます。

まず、httpブロック内にupstreamブロックを定義し、バックエンドサーバーのリストを記述します。次に、locationブロックのproxy_passディレクティブで、http://に続けてupstreamブロックで定義した名前を指定します。デフォルトでは、リクエストは各サーバーに均等に(ラウンドロビン方式で)振り分けられます。

upstream my_app_backend {
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
    server 192.168.1.103:3000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://my_app_backend;
        # proxy_set_header の設定も忘れずに
    }
}

まとめ

本記事では、Nginxをリバースプロキシとして利用するための基本的な設定から、実用的な応用例までを解説しました。proxy_passによるリクエスト転送、proxy_set_headerによるクライアント情報の維持、SSL/TLS終端によるHTTPS化、そしてupstreamブロックを用いた負荷分散は、いずれも現代的なWebシステム構築において非常に重要な技術です。

Nginxリバースプロキシを使いこなすことで、インフラ構成の柔軟性が格段に向上します。今回紹介した機能の他にも、キャッシュ機能(proxy_cache)やWebSocketのプロキシなど、Nginxにはさらに多くの強力な機能が備わっています。ぜひ公式ドキュメントなども参考に、さらなる活用法を探求してみてください。