Nginxリバースプロキシ設定入門

Nginxリバースプロキシ設定入門:Webサーバーの負荷分散とセキュリティ強化
Nginxをリバースプロキシとして活用すれば、Webサーバーの負荷分散・SSL/TLS終端・静的ファイル配信の高速化を実現できます。本記事では、Linux環境でNginxリバースプロキシをゼロから構築する具体的な手順と、実運用に耐える設定テンプレートを完全解説します。Apacheからの移行パターンや、Let’s Encryptとの連携、さらにはHTTP/2・HTTP/3への対応方法まで、現場で即実践できる内容を網羅しています。
目次
- リバースプロキシとは何か?メリットと仕組みを理解する
- Nginxリバースプロキシ導入前の準備:必要な環境と前提条件
- 基本的なNginxリバースプロキシ設定:最小構成から始める
- 負荷分散(ロードバランシング)の設定:効率的なリクエスト処理
- SSL/TLS終端の設定:HTTPS化と証明書管理
- 応用技術:HTTP/2・HTTP/3・WebSocket・gRPC対応
- セキュリティ強化:攻撃耐性と脆弱性対策
- 運用監視:ログ・パフォーマンス・障害時の対応
- トラブルシューティング:よくあるエラーと解決策
- Nginxリバースプロキシに関するFAQ
- まとめ:Nginxリバースプロキシ導入のベストプラクティス
リバースプロキシとは何か?メリットと仕組みを理解する
リバースプロキシは、クライアントからのリクエストを受け取り、内部のサーバーに転送する役割を果たします。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,000 | 4コア以上 | 4GB以上 | 20GB以上 | 1Gbps以上 |
| 10,000〜50,000 | 8コア以上 | 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 updateNginxのインストール
sudo apt install -y nginxNginxの起動と自動起動設定
sudo systemctl start nginx sudo systemctl enable nginxインストール確認
nginx -v
CentOS / RHEL系
EPELリポジトリの有効化
sudo dnf install -y epel-releaseNginxのインストール
sudo dnf install -y nginxNginxの起動と自動起動設定
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編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。




