「NginX- serverコンテキスト」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == serverコンテキストは、仮想サーバを定義するための基本的な構成要素である。<br> このコンテキストは、常にhttpコンテキスト内に配置され、1つのNginXサーバーで複数の仮想ホストを運用することを可能にする。<br> <br> 主要な機能として、特定のIPアドレスやポートでのリクエスト待ち受け、ドメイン名の設定、SSLの設定、静的ファイルの配…」)
 
26行目: 26行目:


== locationコンテキスト ==
== locationコンテキスト ==
==== $realpath_root / $document_root ====
==== 基本的なディレクティブ ====
$realpath_rootと$document_rootの違いを以下に示す。<br>
* root
*: ドキュメントルートの指定
* alias
*: 特定のパスへのエイリアス設定
* index
*: インデックスファイルの指定
<br>
<syntaxhighlight lang="nginx">
# 静的ファイルの配信例
location / {
    root  /var/www/html;
    index index.html;
}
</syntaxhighlight>
<br>
==== アクセス制御 ====
* allow / deny
*: IPベースのアクセス制限
* auth_basic
*: Basic認証の設定
* auth_request
*: 外部認証の設定
<br>
<syntaxhighlight lang="nginx">
# 特定ファイルへのアクセス制限例
# ドキュメントルートの".ht"から始まるファイルはアクセス不可
location ~ /\.ht {
    deny all;
}
<br>
<syntaxhighlight lang="nginx">
# BASIC認証の設定例
location /admin {
    auth_basic          "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="nginx">
# ダイジェスト認証の設定例
# より安全な認証方式であり、パスワードをハッシュ化して送信する
location /secure {
    auth_digest          "Private Area";
    auth_digest_user_file /etc/nginx/htdigest;
    auth_digest_timeout  30s;
    auth_digest_expires  300s;
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="nginx">
# 外部認証の設定例
# サーバでユーザ認証を行い、その結果に基づいてアクセスを制御する
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 "";
    }
}
</syntaxhighlight>
<br>
==== プロキシ関連 ====
* proxy_pass
*: リバースプロキシの設定
* proxy_set_header
*: プロキシヘッダの設定
* proxy_redirect
*: リダイレクトの制御
<br>
<syntaxhighlight lang="nginx">
# プロキシ設定例
location /api {
    proxy_pass      http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
</syntaxhighlight>
<br>
==== ファイル処理 ====
* try_files
*: ファイル検索順序の指定
* autoindex
*: ディレクトリリスティングの制御
* expires
*: キャッシュ制御
<br>
<syntaxhighlight lang="nginx">
# キャッシュ制御の例
location /static {
    expires    30d;
    add_header Cache-Control "public, no-transform";
}
</syntaxhighlight>
<br>
==== FastCGI設定 ====
* fastcgi_pass
*: FastCGIサーバの指定
* fastcgi_param
*: FastCGIパラメータの設定
<br>
<syntaxhighlight lang="nginx">
# 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;
}
</syntaxhighlight>
<br>
==== エラー処理 ====
様々なHTTPエラーに対してカスタムレスポンスが設定できる。<br>
<br>
* error_page
*: エラーページの指定
* return
*: HTTPリターンコードとURLの設定
<br>
<syntaxhighlight lang="nginx">
# エラーページとリターン例
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";
    }
}
</syntaxhighlight>
<br>
==== リライト / リダイレクト ====
* rewrite
*: URLリライトルールの設定
* redirect
*: リダイレクトの設定
<br>
<syntaxhighlight lang="nginx">
# リライトとリダイレクトの設定例
# 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;
    }
}
</syntaxhighlight>
<br>
==== CORS設定 ====
* add_header
*: クロスオリジン制御用ヘッダの追加
<br>
==== SSI (Server Side Includes) ====
* ssi
*: SSIの有効化 / 無効化
<br>
==== PHP-FPM連携 ====
<syntaxhighlight lang="nginx">
# 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;
}
</syntaxhighlight>
<br>
==== $realpath_root / $document_rootの違い ====
* $realpath_root
* $realpath_root
*: シンボリックリンクを解決して実際の物理パスを返す。
*: シンボリックリンクを解決して実際の物理パスを返す。
43行目: 242行目:
* fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
* fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
* fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
* fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
<br>
<br><br>
<br><br>



2024年11月30日 (土) 01:11時点における版

概要

serverコンテキストは、仮想サーバを定義するための基本的な構成要素である。
このコンテキストは、常にhttpコンテキスト内に配置され、1つのNginXサーバーで複数の仮想ホストを運用することを可能にする。

主要な機能として、特定のIPアドレスやポートでのリクエスト待ち受け、ドメイン名の設定、SSLの設定、静的ファイルの配信設定、プロキシ設定等がある。

serverディレクティブの用途を以下に示す。

  • ポート番号の指定 (listen)
  • サーバ名の設定 (server_name)
  • ドキュメントルートの指定 (root)
  • SSL / TLS設定
  • ロケーション設定
  • リダイレクト設定


また、バーチャルホスティングにおいても、同一サーバ上で異なるドメインのWebサイトを運用することができる。

設定の継承関係について、serverコンテキスト内の設定は、より上位のhttpコンテキストからデフォルト値を継承する。
さらに、serverコンテキスト内のlocationコンテキストは、serverコンテキストの設定を継承する。
これにより、効率的で柔軟な設定管理が可能になる。

セキュリティにおいては、SSL / TLS証明書の設定、アクセス制限、リダイレクトルールの設定等が可能であり、安全なWebサービスの提供に貢献する。
また、エラーページのカスタマイズやログの設定も行うことができる。

パフォーマンスの最適化では、キャッシュ設定、バッファサイズの調整、接続数の制限等を設定することができるため、リソース管理が可能である。


locationコンテキスト

基本的なディレクティブ

  • 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;