NginX- locationコンテキスト

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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;