Nginxリバースプロキシ設定入門:Webサーバーの負荷分散とセキュリティ強化

Nginxをリバースプロキシとして活用すれば、Webサーバーの負荷分散・SSL/TLS終端・静的ファイル配信の高速化を実現できます。本記事では、Linux環境でNginxリバースプロキシをゼロから構築する具体的な手順と、実運用に耐える設定テンプレートを完全解説します。Apacheからの移行パターンや、Let’s Encryptとの連携、さらにはHTTP/2・HTTP/3への対応方法まで、現場で即実践できる内容を網羅しています。


目次


リバースプロキシとは何か?メリットと仕組みを理解する

リバースプロキシは、クライアントからのリクエストを受け取り、内部のサーバーに転送する役割を果たします。Nginxをリバースプロキシとして使用する最大のメリットは、負荷分散・セキュリティ強化・パフォーマンス向上の3点に集約されます。

具体的なメリットを以下に示します。

メリット具体的な効果実務での活用例
負荷分散複数のバックエンドサーバーにリクエストを分散し、システム全体の処理能力を向上ECサイトの同時アクセス増加時のレスポンス維持
セキュリティ強化バックエンドサーバーを直接公開せず、リバースプロキシ経由でアクセス制御DDoS攻撃の緩和・IPアドレス隠蔽・WAFとの連携
SSL/TLS終端暗号化処理をリバースプロキシで集中管理し、バックエンドサーバーの負荷軽減HTTPS化によるセキュリティ向上・Let’s Encryptとの連携
静的ファイル配信の高速化Nginxの高速な静的ファイル配信機能を活用し、動的コンテンツと静的コンテンツを分離画像・CSS・JavaScriptファイルの高速配信
キャッシュ機能リバースプロキシでレスポンスをキャッシュし、バックエンドサーバーへの負荷を軽減APIレスポンスのキャッシュ・CDNとの連携

リバースプロキシの仕組みを図で示すと以下の通りです。

[クライアント] → [インターネット] → [Nginxリバースプロキシ] → [バックエンドサーバー1]
                                      → [バックエンドサーバー2]
                                      → [バックエンドサーバー3]

この構成により、クライアントはNginxのIPアドレスのみを知ることになり、バックエンドサーバーの実態は隠蔽されます。また、Nginxがリクエストを受け取り、適切なバックエンドサーバーに転送する役割を果たします。

リバースプロキシとフォワー…

リバースプロキシと混同されやすいのがフォワードプロキシです。両者の違いを以下の表で整理します。

項目リバースプロキシフォワードプロキシ
設置場所サーバー側(Webサーバーの前)クライアント側(ユーザーのネットワーク内)
主な用途負荷分散・セキュリティ強化・SSL終端匿名性確保・アクセス制限・キャッシュ
クライアントからの見え方クライアントはリバースプロキシのIPアドレスを知るクライアントはフォワードプロキシのIPアドレスを知る
代表的な用途例Webサーバーの負荷分散・HTTPS化企業内ネットワークのインターネットアクセス制限

このように、リバースプロキシはサーバー側の技術であり、フォワードプロキシはクライアント側の技術である点が大きな違いです。Nginxをリバースプロキシとして使用する場合、サーバー側の負荷分散やセキュリティ強化に焦点を当てることになります。

Nginxがリバースプロキ…

Nginxがリバースプロキシとして広く採用されている理由は、以下の特徴にあります。

  • 高いパフォーマンス:非同期I/Oモデルにより、高い同時接続性能を実現
  • 軽量なリソース消費:Apacheと比較してメモリ・CPU使用量が少ない
  • 柔軟な設定:豊富なモジュールと設定オプションにより、多様な要件に対応可能
  • 静的ファイル配信の高速化:専用の静的ファイル配信機能を備えている
  • SSL/TLS処理の最適化:ハードウェアアクセラレーションに対応し、暗号化処理を高速化

特に、同時接続数が多いWebサービスにおいて、Nginxのリバースプロキシ機能は非常に有効です。例えば、同時接続数が10,000を超えるようなサービスでは、ApacheよりもNginxの方が圧倒的に優れたパフォーマンスを発揮します。


Nginxリバースプロキシ導入前の準備:必要な環境と前提条件

Nginxをリバースプロキシとして導入する前に、以下の環境と前提条件を整備する必要があります。これらの準備を怠ると、設定ミスやパフォーマンス低下の原因となります。

1. 必要なハードウェア要件

Nginxリバースプロキシのハードウェア要件は、処理するリクエスト数やバックエンドサーバーの数によって異なります。一般的な目安を以下に示します。

想定同時接続数CPUコア数メモリ容量ストレージ容量ネットワーク帯域
1,000未満2コア以上2GB以上10GB以上1Gbps以上
1,000〜10,0004コア以上4GB以上20GB以上1Gbps以上
10,000〜50,0008コア以上8GB以上50GB以上10Gbps以上
50,000以上16コア以上16GB以上100GB以上10Gbps以上

これらの要件は目安であり、実際の負荷に応じて調整が必要です。特に、SSL/TLS終端を行う場合は、暗号化処理に多くのCPUリソースを消費するため、CPUコア数を増やすことを検討してください。

2. 必要なソフトウェア要件

Nginxリバースプロキシを導入するために必要なソフトウェアは以下の通りです。

  • OS:Linux(推奨:Ubuntu 22.04 LTS / CentOS Stream 9 / Debian 12)
  • Nginx:最新の安定版(推奨:Nginx 1.25.x以上)
  • バックエンドサーバー:Apache / Node.js / Python / Java などのWebサーバー
  • SSL/TLS証明書:Let’s Encrypt(無料)または商用証明書
  • モニタリングツール:Prometheus + Grafana / Zabbix / Datadog
  • ログ管理ツール:ELK Stack(Elasticsearch + Logstash + Kibana) / Fluentd + Elasticsearch

Nginxのバージョンについては、最新の安定版を使用することを推奨します。Nginx 1.25.x以降では、HTTP/3(QUIC)や最新のセキュリティ機能がサポートされています。公式ドキュメントによると、Nginx 1.25.xは2024年6月現在で最新の安定版です。

3. 必要なネットワーク要件

Nginxリバースプロキシを導入する際のネットワーク要件は以下の通りです。

  • ポート開放:HTTP(80番)・HTTPS(443番)・カスタムポート(任意)
  • ファイアウォール設定:不要なポートを閉じ、必要なポートのみを開放
  • DNS設定:ドメイン名をNginxリバースプロキシのIPアドレスに向ける
  • バックエンドサーバーとの通信:Nginxとバックエンドサーバー間の通信を許可

特に、バックエンドサーバーとの通信は、Nginxからバックエンドサーバーへのアウトバウンド通信を許可する必要があります。ファイアウォール(例:iptables / firewalld / ufw)を使用して、不要なポートを閉じ、必要なポートのみを開放してください。

4. Nginxのインスト…

Nginxのインストール手順は、使用するOSによって異なります。以下に、主要なLinuxディストリビューションごとのインストール手順を示します。

Ubuntu / Debian系

パッケージリストの更新

sudo apt update

Nginxのインストール

sudo apt install -y nginx

Nginxの起動と自動起動設定

sudo systemctl start nginx sudo systemctl enable nginx

インストール確認

nginx -v

CentOS / RHEL系

EPELリポジトリの有効化

sudo dnf install -y epel-release

Nginxのインストール

sudo dnf install -y nginx

Nginxの起動と自動起動設定

sudo systemctl start nginx sudo systemctl enable nginx

インストール確認

nginx -v

Nginxをインストールしたら、基本的な動作確認を行います。ブラウザでNginxのIPアドレスにアクセスし、デフォルトのウェルカムページが表示されることを確認してください。

5. Nginxの基本的な…

Nginxの設定ファイルは、主に以下のディレクトリに配置されます。

  • /etc/nginx/:メインの設定ファイルが格納されるディレクトリ
  • /etc/nginx/nginx.conf:メインの設定ファイル
  • /etc/nginx/conf.d/:個別の設定ファイルを格納するディレクトリ
  • /etc/nginx/sites-available/:有効化されたサイトの設定ファイルを格納するディレクトリ(Debian系)
  • /etc/nginx/sites-enabled/:有効化されたサイトのシンボリックリンクが格納されるディレクトリ(Debian系)
  • /var/log/nginx/:アクセスログ・エラーログが格納されるディレクトリ

Nginxの設定ファイルは、nginx.confを起点として、conf.d/ディレクトリやsites-available/ディレクトリに分割して管理することが一般的です。これにより、設定の可読性と保守性が向上します。


基本的なNginxリバースプロキシ設定:最小構成から始める

Nginxをリバースプロキシとして機能させるための基本的な設定手順を解説します。このセクションでは、最小構成のリバースプロキシ設定から始め、段階的に機能を追加していきます。

1. 最小構成のNginx…

以下は、最小構成のNginxリバースプロキシ設定です。この設定では、単一のバックエンドサーバーにリクエストを転送します。

設定ファイル(例:/etc/nginx/conf.d/reverse-proxy.conf

server {
    listen 80;
    server_name example.com;

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

この設定の詳細を解説します。

  • listen 80;:HTTP(80番ポート)でリクエストを受け付ける
  • server_name example.com;:example.comドメイン宛てのリクエストを処理する
  • location / { ... }:全てのリクエストをバックエンドサーバーに転送する
  • proxy_pass http://backend-server:8080;:バックエンドサーバー(ポート8080)にリクエストを転送する
  • proxy_set_header:リクエストヘッダーを設定し、バックエンドサーバーに情報を伝達する

主なproxy_set_headerの設定は以下の通りです。

  • Host $host;:元のリクエストのHostヘッダーを転送
  • X-Real-IP $remote_addr;:クライアントのIPアドレスを転送
  • X-Forwarded-For $proxy_add_x_forwarded_for;:リクエスト経路のIPアドレス履歴を転送
  • X-Forwarded-Proto $scheme;:リクエストがHTTPかHTTPSかを転送

2. 設定の反映と動作確認

設定ファイルを保存したら、Nginxの設定を再読み込みします。

sudo nginx -t  # 構文チェック
sudo systemctl reload nginx  # 設定の反映

設定に問題がなければ、ブラウザでhttp://example.comにアクセスし、バックエンドサーバーのレスポンスが表示されることを確認します。

3. 複数のバックエンドサ…

単一のバックエンドサーバーではなく、複数のバックエンドサーバーにリクエストを分散させる場合は、upstreamブロックを使用します。以下は、2つのバックエンドサーバーにリクエストを分散させる設定例です。

設定ファイル(例:/etc/nginx/conf.d/reverse-proxy.conf

upstream backend_servers {
    server backend-server1:8080;
    server backend-server2:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        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ブロックでbackend_serversというグループを定義し、2つのバックエンドサーバーを登録しています。Nginxは、デフォルトでラウンドロビン方式(順番にリクエストを転送)でリクエストを分散します。

4. 特定のパスごとに異な…

特定のパスごとに異なるバックエンドサーバーにリクエストを転送する場合は、locationブロックを複数定義します。以下は、/apiパスはAPIサーバーに、それ以外のパスはWebサーバーに転送する設定例です。

設定ファイル(例:/etc/nginx/conf.d/reverse-proxy.conf

upstream web_servers {
    server web-server:80;
}

upstream api_servers {
    server api-server:8080;
}

server {
    listen 80;
    server_name example.com;

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

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

この設定では、/パスはweb_serversグループに、/apiパスはapi_serversグループにリクエストを転送します。このように、locationブロックを使い分けることで、柔軟なリバースプロキシ設定が可能です。

5. WebSocketの…

WebSocketを使用するアプリケーション(例:チャットアプリ・オンラインゲーム)をリバースプロキシ経由で動作させる場合は、WebSocket特有の設定が必要です。以下は、WebSocketをリバースプロキシ経由で動作させる設定例です。

設定ファイル(例:/etc/nginx/conf.d/reverse-proxy.conf

upstream websocket_servers {
    server websocket-server:8080;
}

server {
    listen 80;
    server_name example.com;

    location /ws {
        proxy_pass http://websocket_servers;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
    }
}

WebSocketをリバースプロキシ経由で動作させるためには、以下の設定が必要です。

  • proxy_http_version 1.1;:HTTP/1.1を使用する
  • proxy_set_header Upgrade $http_upgrade;:WebSocketのアップグレードヘッダーを転送
  • proxy_set_header Connection "upgrade";:接続をアップグレードする

これにより、WebSocketの接続が正常に確立され、リアルタイム通信が可能になります。

6. gRPCのリバースプ…

gRPC(Google Remote Procedure Call)を使用するアプリケーションをリバースプロキシ経由で動作させる場合も、WebSocketと同様に特別な設定が必要です。以下は、gRPCをリバースプロキシ経由で動作させる設定例です。

設定ファイル(例:/etc/nginx/conf.d/reverse-proxy.conf

upstream grpc_servers {
    server grpc-server:50051;
}

server {
    listen 80;
    server_name example.com;

    location / {
        grpc_pass grpc://grpc_servers;
        grpc_set_header Host $host;
        grpc_set_header X-Real-IP $remote_addr;
        grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        grpc_set_header X-Forwarded-Proto $scheme;
    }
}

gRPCをリバースプロキシ経由で動作させるためには、以下の設定が必要です。

  • grpc_pass:gRPC用の転送設定
  • grpc_set_header:gRPC用のヘッダー設定

これにより、gRPCの接続が正常に確立され、リモートプロシージャコールが可能になります。


負荷分散(ロードバランシング)の設定:効率的なリクエスト処理

Nginxのリバースプロキシ機能を活用して、複数のバックエンドサーバーにリクエストを分散させる負荷分散(ロードバランシング)の設定方法を解説します。負荷分散により、システム全体の処理能力を向上させ、ダウンタイムを防ぐことができます。

1. 負荷分散の基本アルゴ…

Nginxがサポートする主な負荷分散アルゴリズムは以下の通りです。

アルゴリズム動作メリットデメリット
ラウンドロビン(デフォルト)リクエストを順番に各サーバーに転送シンプルでバランスが取れるサーバーの処理能力に差がある場合、不均衡が発生
weight(重み付け)各サーバーに重みを設定し、重みに応じてリクエストを転送サーバーの処理能力に応じた負荷分散が可能重みの設定が必要
least_conn(最小接続数)現在の接続数が最も少ないサーバーにリクエストを転送リアルタイムの負荷状況に応じた分散が可能接続数が多い場合、オーバーヘッドが発生
ip_hashクライアントのIPアドレスをハッシュ化し、同じサーバーに転送セッション維持が必要なアプリケーションに適しているサーバーに障害が発生した場合、セッションが失われる
least_time(最小レスポンスタイム)レスポンスタイムが最も短いサーバーにリクエストを転送レスポンスタイムを最適化できるレスポンスタイムの計測にオーバーヘッドが発生
random(ランダム)ランダムにサーバーを選択してリクエストを転送シンプルで予測不可能な分散が可能負荷分散のバランスが取れない可能性がある

これらのアルゴリズムを組み合わせて使用することで、目的に応じた負荷分散が可能です。例えば、セッション維持が必要なアプリケーションにはip_hashを、リアルタイムの負荷状況に応じた分散が必要な場合はleast_connを使用します。

2. ラウンドロビン(デフ…

ラウンドロビンはNginxのデフォルトの負荷分散アルゴリズムです。以下は、ラウンドロビンで負荷分散を行う設定例です。

設定ファイル(例:/etc/nginx/conf.d/load-balancing.conf

upstream backend_servers {
    server backend-server1:8080;
    server backend-server2:8080;
    server backend-server3:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        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ブロック内に3つのバックエンドサーバーを登録しています。Nginxは、デフォルトでラウンドロビン方式でリクエストを分散します。例えば、リクエストが1,2,3,1,2,3,…の順番で各サーバーに転送されます。

3. 重み付け(weigh…

バックエンドサーバーの処理能力に差がある場合、重み付け(weight)を使用して負荷分散を行います。以下は、重み付けで負荷分散を行う設定例です。

設定ファイル(例:/etc/nginx/conf.d/load-balancing.conf

upstream backend_servers {
    server backend-server1:8080 weight=3;
    server backend-server2:8080 weight=2;
    server backend-server3:8080 weight=1;
}

server {
    listen 80;
    server_name example.com;

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

この設定では、backend-server1に重み3、backend-server2に重み2、backend-server3に重み1を設定しています。これにより、リクエストは3:2:1の割合で各サーバーに転送されます。例えば、10件のリクエストがあった場合、backend

【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営