Nginxがリクエストを受け取り処理を行う流れや優先順位と設定ファイルの対応関係についての認識が曖昧だったのでまとめました。
1. NGINX のリクエスト処理の流れ
- クライアントが HTTP リクエストを送信
- Hostヘッダーをもとに適切なserverブロックを選択
- e.g.
GET /index.html HTTP/1.1 Host: example.com
-
server_nameを元に、一致するserverを探す- 一致しない場合は
default_server(または最初のserver)が選ばれる -
locationディレクティブで処理を決定
- 一致しない場合は
- リクエストされたパス(
/index.htmlなど)に合致したlocationブロックを選択 - 対応する処理を実行
-
rootディレクティブ : 静的ファイルを返す -
proxy_pass: 別のサーバーにリクエストを転送 -
return: 即座にレスポンスを返す(リダイレクトなど) -
rewrite: URL をリライトする
-
2. server ブロックの選択
NginxはリクエストのHostヘッダーを元に、以下の優先順位で適切なserverブロックを選ぶ
-
server_nameの完全一致 - ワイルドカード(*.example.com など)
-
default_serverが適用(なければ最初のserver)
e.g.
server {
listen 80;
server_name example.com;
}
server {
listen 80;
server_name *.example.com;
}
server {
listen 80 default_server;
server_name _;
}
| Hostヘッダー | 適用されるserver |
|---|---|
| example.com | 1番目のserver(完全一致) |
| app.example.com | 2番目のserver(ワイルドカード) |
| unknown.com | 3番目のserver(default_server) |
server_nameについてはこちら参考
3. location ブロックの選択ルール
serverが決まったら、リクエストURLに対して最も適したlocationブロックが選ばれる
マッチングの優先順位は以下の通り
- 完全一致(
location = /exact/path) - 前方一致(
location /prefix) - 正規表現(
location ~ regex) - デフォルト(
location /)
server {
listen 80;
server_name example.com;
location = /ping {
return 200 "pong";
}
location /api/ {
proxy_pass http://backend;
}
location ~ \.php$ {
fastcgi_pass php-fpm;
}
location / {
root /var/www/html;
}
}
| リクエストURL | 適用されるlocation |
|---|---|
| /ping | location = /ping(完全一致) |
| /api/users | location /api/(前方一致) |
| /index.php | location ~ .php$(正規表現) |
| /index.html | location /(デフォルト) |
4. リバースプロキシ (proxy_pass)
proxy_passを使うと、Nginxはリクエストをバックエンド(別のサーバー)に転送する
e.g. http://example.com/api/usersのリクエストをhttp://backend/api/usersに転送
- 複数サーバー指定(負荷分散)
# バックエンドの定義
upstream backend {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
# リバースプロキシ設定
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://backend;
}
}
- ローカルのアプリケーション
upstream backend {
server localhost:8080;
}
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://backend;
}
}
5. 静的ファイルの処理 (root & index)
rootはドキュメントルートを設定。
indexはデフォルトのファイル (index.html) を指定。
e.g. -> http://example.com/にアクセスすると/var/www/html/index.htmlを返す
location / {
root /var/www/html;
index index.html;
}