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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
26行目: 26行目:


== listenディレクティブ ==
== listenディレクティブ ==
ポート番号を指定する。<br>
IPアドレスとポート番号を指定する。<br>
複数指定することもできる。<br>
<br>
IPv4 / IPv6、ポート、UNIXドメインソケットをサポートしている。<br>
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  server {
  server {
     listen 80;
     listen 80;
    listen 443 ssl;
    listen [::]:80;
   
   
     # ...略
     # ...略
37行目: 43行目:


== server_nameディレクティブ ==
== server_nameディレクティブ ==
サーバ名を指定する。<br>
サーバ名 (バーチャルホストの識別も可) を指定する。<br>
<br>
完全修飾ドメイン名、ワイルドカード、正規表現をサポートしている。<br>
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  server {
  server {
43行目: 52行目:
   
   
     server_name example.com;
     server_name example.com;
    # 正規表現で記述する場合
    # 例: server_name *.example.com ~^www\d+\.example\.com$;
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
49行目: 61行目:
== rootディレクティブ ==
== rootディレクティブ ==
ドキュメントルートを指定する。<br>
ドキュメントルートを指定する。<br>
これは、全てのリクエストに対する相対パスの基準点となる。<br>
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  server {
  server {
58行目: 72行目:
<br><br>
<br><br>


== locationコンテキスト ==
== indexディレクティブ ==
==== 基本的なディレクティブ ====
デフォルトページを指定する。<br>
* root
指定順に検索され、最初に見つかったファイルが使用される。<br>
*: ドキュメントルートの指定
<br>
* alias
これは、locationコンテキストでも設定することができる。<br>
*: 特定のパスへのエイリアス設定
* index
*: インデックスファイルの指定
<br>
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # 静的ファイルの配信例
  server {
    # ...略
   
   
location / {
     index index.php index.html;
    root  /var/www/html;
     index index.html;
  }
  }
</syntaxhighlight>
<br><br>
== アクセス制御 ==
==== 許可 ====
特定のIPアドレス / 範囲からのアクセスを許可する。<br>
<syntaxhighlight lang="nginx">
allow 10.0.0.0/8;
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== アクセス制御 ====
==== 拒否 ====
* allow / deny
特定のIPアドレス / 範囲からのアクセスを禁止する。<br>
*: IPベースのアクセス制限
<syntaxhighlight lang="nginx">
* auth_basic
deny 192.168.1.0/24;
*: Basic認証の設定
</syntaxhighlight>
* auth_request
*: 外部認証の設定
<br>
<br>
==== ファイルアップロード等の制限 ====
クライアントリクエストボディの最大サイズを指定する。<br>
<syntaxhighlight lang="nginx">
client_max_body_size 10M;  # 最大10[MB]に制限する場合
</syntaxhighlight>
<br><br>
== ログ設定 ==
==== アクセスログの保存先とフォーマットの指定 ====
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # 特定ファイルへのアクセス制限例
  access_log /var/log/nginx/access.log main;
# ドキュメントルートの".ht"から始まるファイルはアクセス不可
  </syntaxhighlight>
location ~ /\.ht {
    deny all;
  }
<br>
<br>
==== エラーログの保存先とログレベルの指定 ====
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # BASIC認証の設定例
  error_log /var/log/nginx/error.log warn;
location /admin {
  </syntaxhighlight>
    auth_basic          "Restricted Area";
<br><br>
    auth_basic_user_file /etc/nginx/.htpasswd;
 
  }
== タイムアウト関連 ==
==== client_body_timeoutディレクティブ ====
リクエストボディ受信のタイムアウトを指定する。<br>
これは、クライアントからのデータ受信間隔を制限する。<br>
<syntaxhighlight lang="nginx">
client_body_timeout 60s;
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== client_header_timeoutディレクティブ ====
リクエストヘッダ受信のタイムアウトを指定する。<br>
これは、ヘッダ受信の制限時間のことである。<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # ダイジェスト認証の設定例
  client_header_timeout 60s;
# より安全な認証方式であり、パスワードをハッシュ化して送信する
location /secure {
    auth_digest          "Private Area";
    auth_digest_user_file /etc/nginx/htdigest;
    auth_digest_timeout  30s;
    auth_digest_expires  300s;
}
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== keepalive_timeoutディレクティブ ====
Keep-Alive接続のタイムアウトを指定する。<br>
これは、持続的接続の維持時間のことである。<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # 外部認証の設定例
  keepalive_timeout 75s;
# サーバでユーザ認証を行い、その結果に基づいてアクセスを制御する
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>
  </syntaxhighlight>
<br>
<br>
==== プロキシ関連 ====
==== send_timeoutディレクティブ ====
* proxy_pass
レスポンス送信のタイムアウトを指定する。<br>
*: リバースプロキシの設定
これは、クライアントへの送信処理のタイムアウトのことである。<br>
* proxy_set_header
<syntaxhighlight lang="nginx">
*: プロキシヘッダの設定
send_timeout 60s;
* proxy_redirect
</syntaxhighlight>
*: リダイレクトの制御
<br><br>
 
== バッファ設定 ==
==== client_body_buffer_sizeディレクティブ ====
リクエストボディのバッファサイズを指定する。<br>
<syntaxhighlight lang="nginx">
client_body_buffer_size 128k;
</syntaxhighlight>
<br>
<br>
==== client_header_buffer_sizeディレクティブ ====
リクエストヘッダのバッファサイズを指定する。<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # プロキシ設定例
  client_header_buffer_size 1k;
location /api {
    proxy_pass      http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== ファイル処理 ====
==== large_client_header_buffersディレクティブ ====
* try_files
大きなヘッダ用のバッファを指定する。<br>
*: ファイル検索順序の指定
<syntaxhighlight lang="nginx">
* autoindex
large_client_header_buffers 4 8k;
*: ディレクトリリスティングの制御
</syntaxhighlight>
* expires
<br><br>
*: キャッシュ制御
 
== SSL / TLS設定ディレクティブ ==
==== ssl_certificateディレクティブ ====
SSL証明書ファイルのパスを指定する。<br>
ssl_certificate /path/cert.pem;
<br>
<br>
==== ssl_certificate_keyディレクティブ ====
秘密鍵ファイルのパスを指定する。<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # キャッシュ制御の例
  ssl_certificate_key /path/key.pem;
location /static {
    expires    30d;
    add_header Cache-Control "public, no-transform";
}
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== FastCGI設定 ====
==== ssl_protocolsディレクティブ ====
* fastcgi_pass
使用するSSL / TLSプロトコルを指定する。<br>
*: FastCGIサーバの指定
* fastcgi_param
*: FastCGIパラメータの設定
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # FastCGIの設定例
  ssl_protocols TLSv1.2 TLSv1.3;
# 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>
  </syntaxhighlight>
<br>
<br>
==== エラー処理 ====
==== ssl_ciphersディレクティブ ====
様々なHTTPエラーに対してカスタムレスポンスが設定できる。<br>
暗号化スイートを指定する。<br>
<br>
* error_page
*: エラーページの指定
* return
*: HTTPリターンコードとURLの設定
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # エラーページとリターン例
  ssl_ciphers HIGH:!aNULL:!MD5;
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>
  </syntaxhighlight>
<br>
<br>
==== リライト / リダイレクト ====
==== ssl_session_timeoutディレクティブ ====
* rewrite
SSLセッションのタイムアウトを指定する。<br>
*: URLリライトルールの設定
* redirect
*: リダイレクトの設定
<br>
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # リライトとリダイレクトの設定例
  ssl_session_timeout 1d;
# 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>
  </syntaxhighlight>
<br>
<br>
==== CORS設定 ====
==== ssl_session_cacheディレクティブ ====
* add_header
SSLセッションキャッシュを設定する。<br>
*: クロスオリジン制御用ヘッダの追加
<br>
==== SSI (Server Side Includes) ====
* ssi
*: SSIの有効化 / 無効化
<br>
==== PHP-FPM連携 ====
  <syntaxhighlight lang="nginx">
  <syntaxhighlight lang="nginx">
  # PHP-FPM連携例
  ssl_session_cache shared:SSL:50m;
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>
  </syntaxhighlight>
<br>
==== $realpath_root / $document_rootの違い ====
* $realpath_root
*: シンボリックリンクを解決して実際の物理パスを返す。
*: より安全で確実な参照が可能となる。
*: <br>
* $document_root
*: 設定ファイルで指定されたrootディレクティブの値をそのまま使用する。
*: シンボリックリンクが解決されない
<br>
一般的な環境では両者は同じ結果になる。<br>
<br>
<u>しかし、セキュリティを重視する場合は$realpath_rootが推奨される。</u><br>
特に、シンボリックリンクを使用している環境では、この違いが重要になる。<br>
<br>
* fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
* fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
<br>
<br><br>
<br><br>



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

概要

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

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

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

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


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

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

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

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


listenディレクティブ

IPアドレスとポート番号を指定する。
複数指定することもできる。

IPv4 / IPv6、ポート、UNIXドメインソケットをサポートしている。

 server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
 
    # ...略
 }



server_nameディレクティブ

サーバ名 (バーチャルホストの識別も可) を指定する。

完全修飾ドメイン名、ワイルドカード、正規表現をサポートしている。

 server {
    # ...略
 
    server_name example.com;
 
    # 正規表現で記述する場合
    # 例: server_name *.example.com ~^www\d+\.example\.com$;
 }



rootディレクティブ

ドキュメントルートを指定する。
これは、全てのリクエストに対する相対パスの基準点となる。

 server {
    # ...略
 
    root /var/www/html;
 }



indexディレクティブ

デフォルトページを指定する。
指定順に検索され、最初に見つかったファイルが使用される。

これは、locationコンテキストでも設定することができる。

 server {
    # ...略
 
    index index.php index.html;
 }



アクセス制御

許可

特定のIPアドレス / 範囲からのアクセスを許可する。

 allow 10.0.0.0/8;


拒否

特定のIPアドレス / 範囲からのアクセスを禁止する。

 deny 192.168.1.0/24;


ファイルアップロード等の制限

クライアントリクエストボディの最大サイズを指定する。

 client_max_body_size 10M;  # 最大10[MB]に制限する場合



ログ設定

アクセスログの保存先とフォーマットの指定

 access_log /var/log/nginx/access.log main;


エラーログの保存先とログレベルの指定

 error_log /var/log/nginx/error.log warn;



タイムアウト関連

client_body_timeoutディレクティブ

リクエストボディ受信のタイムアウトを指定する。
これは、クライアントからのデータ受信間隔を制限する。

 client_body_timeout 60s;


client_header_timeoutディレクティブ

リクエストヘッダ受信のタイムアウトを指定する。
これは、ヘッダ受信の制限時間のことである。

 client_header_timeout 60s;


keepalive_timeoutディレクティブ

Keep-Alive接続のタイムアウトを指定する。
これは、持続的接続の維持時間のことである。

 keepalive_timeout 75s;


send_timeoutディレクティブ

レスポンス送信のタイムアウトを指定する。
これは、クライアントへの送信処理のタイムアウトのことである。

 send_timeout 60s;



バッファ設定

client_body_buffer_sizeディレクティブ

リクエストボディのバッファサイズを指定する。

 client_body_buffer_size 128k;


client_header_buffer_sizeディレクティブ

リクエストヘッダのバッファサイズを指定する。

 client_header_buffer_size 1k;


large_client_header_buffersディレクティブ

大きなヘッダ用のバッファを指定する。

 large_client_header_buffers 4 8k;



SSL / TLS設定ディレクティブ

ssl_certificateディレクティブ

SSL証明書ファイルのパスを指定する。

ssl_certificate /path/cert.pem;


ssl_certificate_keyディレクティブ

秘密鍵ファイルのパスを指定する。

 ssl_certificate_key /path/key.pem;


ssl_protocolsディレクティブ

使用するSSL / TLSプロトコルを指定する。

 ssl_protocols TLSv1.2 TLSv1.3;


ssl_ciphersディレクティブ

暗号化スイートを指定する。

 ssl_ciphers HIGH:!aNULL:!MD5;


ssl_session_timeoutディレクティブ

SSLセッションのタイムアウトを指定する。

 ssl_session_timeout 1d;


ssl_session_cacheディレクティブ

SSLセッションキャッシュを設定する。

 ssl_session_cache shared:SSL:50m;