Nginx ロケーションブロック解説:Webトラフィックルーティング
Nginxは、Webサーバー、リバースプロキシ、ロードバランサーとして、その速度と柔軟性で知られています。リクエスト処理を正確に制御するための核となるメカニズムが、ロケーションブロックです。ロケーションブロックを習得することは、パフォーマンスの最適化、多様なアプリケーションエンドポイントの管理、および特定のURIの保護を目指す管理者にとって不可欠です。
このガイドでは、Nginxロケーションブロックについて包括的に解説し、さまざまなマッチングモディファイア、重要な処理順序、そしてWebトラフィックを効率的にルーティングするための実践的な例を説明します。
ロケーションブロックの役割と構造
locationブロックは、リクエストURI(Uniform Resource Identifier)に基づいてNginxがリクエストにどのように応答すべきかを定義します。これらのブロックは常にserverブロック内にネストされます。
クライアントがリクエスト(例:GET /images/logo.png)を行うと、Nginxは、リスニングしているserverブロック内で定義されているすべてのロケーションブロックに対してリクエストURIをチェックし、ファイルの提供、クライアントのリダイレクト、アプリケーションサーバーへのリクエストのプロキシなど、適切な処理を決定します。
基本構文
構文は、モディファイア(または省略)とそれに続くパターン(URI)で構成されます。
location [modifier] [pattern] {
# Configuration directives (e.g., root, index, proxy_pass)
}
ロケーションマッチタイプ(モディファイア)の理解
Nginxは、パターンマッチを定義するための5つの主要な方法を提供しています。モディファイアの選択は、パフォーマンスとルーティングの精度に大きな影響を与えます。
1. プレフィックスマッチ(モディファイアなし)
これはデフォルトのマッチタイプです。Nginxは、リクエストURIと一致する最も長い開始文字列を検索します。
| モディファイア | 例 | 動作 | 最適なユースケース |
|---|---|---|---|
| (なし) | location /blog/ |
/blog/で始まるURIにマッチします(例:/blog/post/1)。 |
一般的な用途、サイトの大部分を定義する際に使用。 |
例:
location /docs/ {
root /var/www/html/public;
# URIが/docs/manual.pdfの場合、Nginxは/var/www/html/public/docs/manual.pdfを探します
}
2. 完全一致(=)
このモディファイアは、URIとパターンが完全に一致することを強制します。一致が見つかった場合、Nginxは他のロケーションの検索を直ちに停止します。これは最速のマッチタイプです。
| モディファイア | 例 | 動作 | 最適なユースケース |
|---|---|---|---|
= |
location = /favicon.ico |
/favicon.icoというURIにのみ完全に一致します。 |
特定の、頻繁にリクエストされるファイルやデフォルトページを処理する際に使用。 |
3. 最長プレフィックス、非正規表現(^~)
これは特殊なプレフィックスマッチです。Nginxが^~を使用して最長プレフィックスマッチを見つけた場合、正規表現(regex)ロケーションブロックのチェックを直ちに停止し、それらを実質的に上書きします。
| モディファイア | 例 | 動作 | 最適なユースケース |
|---|---|---|---|
^~ |
location ^~ /assets/ |
/assets/で始まるURIにマッチし、低速な正規表現マッチがチェックされるのを防ぎます。 |
静的アセットを迅速に提供し、アセットディレクトリが予測可能に処理されるようにする際に使用。 |
4. 大文字・小文字を区別する正規表現(~)
これは、Perl互換正規表現(PCRE)を使用してマッチングを行います。強力ですが、プレフィックスマッチよりも低速です。最初にマッチした正規表現ブロックが採用されます。
| モディファイア | 例 | 動作 | 最適なユースケース |
|---|---|---|---|
~ |
location ~ \.php$ |
.phpで終わる任意のURIにマッチします。 |
特定のファイルタイプ処理(例:PHPスクリプトをPHP-FPMに渡す)に使用。 |
5. 大文字・小文字を区別しない正規表現(~*)
~と同じですが、マッチングではURIの大文字・小文字が区別されません。
| モディファイア | 例 | 動作 | 最適なユースケース |
|---|---|---|---|
~* |
location ~* \.(jpg|gif|png)$ |
大文字・小文字を問わず画像ファイル拡張子にマッチします(例:.JPGまたは.png)。 |
大文字・小文字の整合性が問題となる可能性のあるファイルを処理する際に使用。 |
重要なロケーション処理順序
Nginxがロケーションブロックを処理する順序を理解することは、予期せぬ動作を避けるために不可欠です。Nginxは設定ファイルを単に上から下へ読み込むわけではありません。厳格な階層を使用します。
- 完全一致(
=): Nginxはまず、すべての完全一致ブロックをチェックします。一致が見つかった場合、処理は直ちに停止し、リクエストはそのブロックによって処理されます。 - 最長プレフィックスマッチのオーバーライド(
^~): 次に、Nginxは^~で定義されたすべてのロケーションブロックを検索します。最長のマッチが見つかった場合、処理は直ちに停止します。 - 正規表現(
~および~*): リクエストが=または^~によって処理されなかった場合、Nginxは設定ファイルに記述された順序で、すべての正規表現ロケーション(~および~*)をチェックします。最初にマッチしたものが使用され、処理は停止します。 - 最長標準プレフィックスマッチ(モディファイアなし): 正規表現マッチが見つからなかった場合、Nginxは最終的に最も長くマッチする標準プレフィックスロケーション(モディファイアなしのもの)を使用します。
- キャッチオール(
location /): 他のどのブロックもマッチしなかった場合、ルートロケーション(/)がフォールバックハンドラーとして使用されます。
ヒント: 標準のプレフィックスマッチよりも長い
^~マッチがある場合、正規表現ブロックがURIにマッチしたとしても、^~が常に優先され、正規表現ブロックがチェックされるのを防ぎます。
実践的な設定シナリオ
1. パフォーマンスのための静的アセットの優先
Nginxが静的ファイルを直接かつ迅速に提供し、低速な正規表現チェックやアプリケーションサーバーによる不要な処理を防ぐには、^~モディファイアを使用します。
server {
listen 80;
server_name myapp.com;
# 1. メインページの完全一致(最優先)
location = / {
proxy_pass http://backend_app_server;
}
# 2. 静的アセットの高速処理、正規表現チェックをバイパス
location ^~ /static/ {
root /var/www/site;
expires 30d;
break;
}
# 3. 一般的なメディアファイルの正規表現
location ~* \.(gif|ico|css|js)$ {
root /var/www/site;
expires 7d;
}
# 4. その他のすべての動的リクエストのフォールバック
location / {
proxy_pass http://backend_app_server;
}
}
2. APIトラフィックのルーティングとプロキシ
Nginxをリバースプロキシとして使用する場合、ロケーションブロックはトラフィックを正しいアップストリームアプリケーションサーバーに誘導するために不可欠です。
location /api/v1/ {
# Nginxがクライアントの接続設定を尊重するようにする
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# /api/v1/で始まるすべてのトラフィックをバックエンドサービスにルーティングする
proxy_pass http://api_backend_service/v1/;
# URIから/api/v1/を削除してアップストリームに渡す必要がある場合は、
# 正規表現マッチとリライトを使用します。
# location ~ ^/api/v1/(.*)$ {
# proxy_pass http://api_backend_service/$1;
# }
}
3. 機密ディレクトリの保護
ロケーションブロックは、設定ファイルや.gitのような隠しディレクトリなど、機密性の高い内部ディレクトリへの外部からのアクセスを拒否するために使用できます。
# ドットで始まるファイル(隠しファイル)へのアクセスを拒否する
location ~ /\.(ht|svn|git) {
deny all;
return 404; # 存在を明らかにしないために、403ではなく404を返す
}
# 特定の設定ディレクトリへのアクセスを拒否する
location /app/config/ {
deny all;
}
セキュリティ警告:
aliasとrootの使用ロケーションブロック内でファイルパスを設定する際、
rootとaliasの違いに注意してください。
root: 定義されたパスに完全なリクエストURIを追加します。(例:location /images/+root /data/は/data/images/filename.jpgになります)alias: URIのマッチした部分を定義されたパスに置き換えます。これは、ロケーションブロックが正規表現を使用する場合や、ファイルを配信する前にパスの一部を削除する必要がある場合にしばしば必要となります。(例:location /static/+alias /opt/app/files/は/opt/app/files/filename.jpgになります)
4. 末尾のスラッシュとリダイレクトの処理
ディレクトリが常に末尾のスラッシュ(/)で終わるようにするなど、一貫したURL構造を強制することがしばしば望ましいです。
# ディレクトリパスに末尾のスラッシュがない場合、それを強制する
location ~* /[a-z0-9\-_]+$ {
# URIがファイルにマッチする場合、Nginxはそれを配信しようとします。そうでない場合、ディレクトリとして扱います。
# リクエストされたURIがディスク上のディレクトリにマップされるかどうかを確認します。
if (-d $request_filename) {
return 301 $uri/;
}
}
まとめ
Nginxのロケーションブロックは、サーバー設定の根幹をなすものであり、すべての受信リクエストに対してきめ細かな制御を提供します。5つのマッチングモディファイア(=、^~、~、~*、およびプレフィックス)と厳格な処理順序を理解することで、管理者は高度に最適化され、効率的で信頼性の高いルーティング構成を作成できます。特にプレフィックスと正規表現のマッチを混在させる場合は、トラフィックが意図したとおりに流れることを確認するために、変更を常に徹底的にテストしてください。