| この記事の要点 |
|
概要
本記事では、リバースプロキシ の代表実装である nginx を、実際にリバースプロキシとして設定する方法を具体的なディレクティブとともに解説します。中心となるのは proxy_pass・upstream・location・proxy_set_header の 4 つです。これらを組み合わせると、SSL 終端・負荷分散・パスベースルーティングを 1 つの設定ファイルで実現できます。設定ファイルの基礎は conf(.conf) も参照してください。親項目は 負荷分散・プロキシ・CDN です。
仕組み
nginx の設定は http ブロックの中に server ブロックを置き、その中に location ブロックを並べる入れ子構造です。リバースプロキシに関わる主要ディレクティブは次のとおりです。
- proxy_pass: その
locationにマッチした要求の転送先 (バックエンドの URL や upstream 名) を指定する。リバースプロキシの心臓部。 - upstream: 複数のバックエンドサーバを 1 つのグループ名にまとめる。分散アルゴリズム (
least_conn/ip_hash等) もここで指定する。 - location: パス (URL) ごとに処理を分ける。
/apiと/で別のバックエンドへ送るといった振り分けに使う。 - proxy_set_header: バックエンドへ転送する際にヘッダを追加・上書きする。クライアントの元 IP やホスト名を伝えるために必須。
とくに proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; は、転送のたびにクライアントの IP を追記していくため、バックエンドが本来のアクセス元を把握できます。X-Forwarded-Proto $scheme は、クライアントが HTTP/HTTPS どちらで来たかをバックエンドへ伝えます。HTTPS の基礎は HTTPS を参照してください。
設定・実用例
HTTPS で受け、/api/ はアプリ群へ負荷分散、それ以外はローカルの静的ファイルを返す、実用的な構成例です。HTTP (80) は HTTPS へリダイレクトします。
# 複数のアプリサーバをまとめる
upstream api_backend {
least_conn;
server 10.0.0.21:8000;
server 10.0.0.22:8000;
server 10.0.0.23:8000 backup; # 通常は使わない予備機
}
# HTTP は HTTPS へリダイレクト
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
# HTTPS で受けて SSL 終端
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
# /api/ への要求はアプリ群へ転送
location /api/ {
proxy_pass http://api_backend;
# クライアントの本来の情報を引き継ぐ (定番セット)
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_read_timeout 60s;
}
# それ以外は静的ファイルを直接配信
location / {
root /var/www/html;
index index.html;
}
}
設定変更後は構文チェックしてから再読み込みします。サービスを止めずに反映できます。
# 構文チェック
sudo nginx -t
# 問題なければ無停止で再読み込み
sudo nginx -s reload
# もしくは
sudo systemctl reload nginx
主な用途
- SSL 終端 + 平文転送: 証明書を nginx に集約し、バックエンドは HTTP で単純運用する。
- 負荷分散:
upstreamに複数台並べ、proxy_passでグループへ振り分ける。 - パスベースルーティング:
/apiはアプリ、/staticは静的配信、とlocationで分ける。 - WebSocket 中継:
Upgrade/Connectionヘッダを設定して双方向通信を通す。 - キャッシュ前段:
proxy_cacheでバックエンドの応答をキャッシュし負荷を下げる。
主要ディレクティブの整理
| ディレクティブ | 役割 | 記述例 |
|---|---|---|
| proxy_pass | 転送先の指定 | proxy_pass http://api_backend; |
| upstream | バックエンド群の定義 | upstream api_backend { ... } |
| location | パスごとの振り分け | location /api/ { ... } |
| proxy_set_header | ヘッダの付与/上書き | proxy_set_header Host $host; |
| ssl_certificate | SSL 終端の証明書 | ssl_certificate /path/crt; |
注意点
- proxy_pass の末尾スラッシュ:
proxy_pass http://backend/;と/有無でlocationのパス処理が変わる。意図しないパス書き換えに注意。 - Host ヘッダの引き継ぎ:
proxy_set_header Host $host;を忘れると、バックエンドが想定したホスト名で動作せず 404 やリダイレクトループになることがある。 - X-Forwarded-For の信頼: 外部から直接届く位置のヘッダはクライアントが詐称できる。アプリ側は信頼するプロキシの値だけ採用する。
- タイムアウト: 長時間処理やストリーミングでは
proxy_read_timeoutを延ばさないと途中で切れる。 - reload 前に nginx -t: 構文エラーのまま reload すると反映されない/起動失敗する。必ず
nginx -tで検証する。
関連リンク
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38