NginX- locationコンテキスト
ナビゲーションに移動
検索に移動
概要
locationコンテキストは、特定のURIパターンに対する処理を定義するNginXの重要な設定ブロックである。
serverコンテキスト内で使用され、クライアントのリクエストURIに基づいて異なる処理を実現する。
マッチング方式として、前方一致、正規表現、完全一致等があり、これらの優先順位に基づいて最適なlocationブロックが選択される。
特に、=
マッチが最も優先度が高く、次いで^~
による前方一致、その後に正規表現マッチが続く。
設定できるものとして、静的ファイルの配信、プロキシ設定、リダイレクト、アクセス制御、FastCGI連携等がある。
また、try_files
ディレクティブを使用することにより、複数のファイルパスを順次確認する柔軟な設定も可能である。
継承関係において、locationコンテキストはserverコンテキストの設定を継承するが、独自の設定で上書きすることも可能である。
さらに、locationコンテキストをネストすることで、より詳細な制御を実現することができる。
エラー処理やログ設定もlocationコンテキスト内でも設定可能であり、特定のURIパターンに対して独自のエラーページやログフォーマットを定義できる。
基本的なディレクティブ
- root
- ドキュメントルートの指定
- alias
- 特定のパスへのエイリアス設定
- index
- インデックスファイルの指定
# 静的ファイルの配信例
location / {
root /var/www/html;
index index.html;
}
アクセス制御
- allow / deny
- IPベースのアクセス制限
- auth_basic
- Basic認証の設定
- auth_request
- 外部認証の設定
# 特定ファイルへのアクセス制限例
# ドキュメントルートの".ht"から始まるファイルはアクセス不可
location ~ /\.ht {
deny all;
}
<br>
<syntaxhighlight lang="nginx">
# BASIC認証の設定例
location /admin {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
# ダイジェスト認証の設定例
# より安全な認証方式であり、パスワードをハッシュ化して送信する
location /secure {
auth_digest "Private Area";
auth_digest_user_file /etc/nginx/htdigest;
auth_digest_timeout 30s;
auth_digest_expires 300s;
}
# 外部認証の設定例
# サーバでユーザ認証を行い、その結果に基づいてアクセスを制御する
location /private {
auth_request /auth;
auth_request_set $auth_status $upstream_status;
location = /auth {
internal;
proxy_pass http://auth-server/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
}
プロキシ関連
- proxy_pass
- リバースプロキシの設定
- proxy_set_header
- プロキシヘッダの設定
- proxy_redirect
- リダイレクトの制御
# プロキシ設定例
location /api {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
ファイル処理
- try_files
- ファイル検索順序の指定
- autoindex
- ディレクトリリスティングの制御
- expires
- キャッシュ制御
# キャッシュ制御の例
location /static {
expires 30d;
add_header Cache-Control "public, no-transform";
}
FastCGI設定
- fastcgi_pass
- FastCGIサーバの指定
- fastcgi_param
- FastCGIパラメータの設定
# FastCGIの設定例
# PHPアプリケーションとの連携に必要なバッファ設定やパス情報の処理を含む
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include fastcgi_params;
}
エラー処理
様々なHTTPエラーに対してカスタムレスポンスが設定できる。
- error_page
- エラーページの指定
- return
- HTTPリターンコードとURLの設定
# エラーページとリターン例
location /download {
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /404.html {
internal;
return 404 "File not found.\n";
}
location = /50x.html {
internal;
return 500 "Server error occurred.\n";
}
}
リライト / リダイレクト
- rewrite
- URLリライトルールの設定
- redirect
- リダイレクトの設定
# リライトとリダイレクトの設定例
# URLの書き換えやリダイレクトが設定できる
# 以下の例では、lastフラグで処理を終了して、permanentフラグで301リダイレクトを指定している
location /old-page {
# 301永続的リダイレクト
return 301 /new-page;
}
location /blog {
# URLの書き換え
rewrite ^/blog/(\d{4})/(\d{2})/(\d{2})/(.*)$ /posts/$1-$2-$3-$4 last;
# 条件付きリライト
if ($host ~* ^www\.(.*)) {
rewrite ^(.*)$ http://$1$1 permanent;
}
}
CORS設定
- add_header
- クロスオリジン制御用ヘッダの追加
SSI (Server Side Includes)
- ssi
- SSIの有効化 / 無効化
PHP-FPM連携
# PHP-FPM連携例
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
$realpath_root / $document_rootの違い
- $realpath_root
- シンボリックリンクを解決して実際の物理パスを返す。
- より安全で確実な参照が可能となる。
- $document_root
- 設定ファイルで指定されたrootディレクティブの値をそのまま使用する。
- シンボリックリンクが解決されない
一般的な環境では両者は同じ結果になる。
しかし、セキュリティを重視する場合は$realpath_rootが推奨される。
特に、シンボリックリンクを使用している環境では、この違いが重要になる。
- fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;