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

提供: MochiuWiki : SUSE, EC, PCB

ページの作成:「== 概要 == serverコンテキストは、仮想サーバを定義するための基本的な構成要素である。<br> このコンテキストは、常にhttpコンテキスト内に配置され、1つのNginXサーバーで複数の仮想ホストを運用することを可能にする。<br> <br> 主要な機能として、特定のIPアドレスやポートでのリクエスト待ち受け、ドメイン名の設定、SSLの設定、静的ファイルの配…」
 
 
(同じ利用者による、間の4版が非表示)
25行目: 25行目:
<br><br>
<br><br>


== locationコンテキスト ==
== listenディレクティブ ==
==== $realpath_root / $document_root ====
IPアドレスとポート番号を指定する。<br>
$realpath_rootと$document_rootの違いを以下に示す。<br>
複数指定することもできる。<br>
* $realpath_root
*: シンボリックリンクを解決して実際の物理パスを返す。
*: より安全で確実な参照が可能となる。
*: <br>
* $document_root
*: 設定ファイルで指定されたrootディレクティブの値をそのまま使用する。
*: シンボリックリンクが解決されない
<br>
<br>
一般的な環境では両者は同じ結果になる。<br>
IPv4 / IPv6、ポート、UNIXドメインソケットをサポートしている。<br>
<br>
<br>
<u>しかし、セキュリティを重視する場合は$realpath_rootが推奨される。</u><br>
<syntaxhighlight lang="nginx">
特に、シンボリックリンクを使用している環境では、この違いが重要になる。<br>
server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    # ...略
}
</syntaxhighlight>
<br><br>
 
== server_nameディレクティブ ==
サーバ名 (バーチャルホストの識別も可) を指定する。<br>
<br>
<br>
* fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
完全修飾ドメイン名、ワイルドカード、正規表現をサポートしている。<br>
* fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
<br>
<syntaxhighlight lang="nginx">
server {
    # ...略
    server_name example.com;
    # 正規表現で記述する場合
    # 例: server_name *.example.com ~^www\d+\.example\.com$;
}
</syntaxhighlight>
<br><br>
 
== rootディレクティブ ==
ドキュメントルートを指定する。<br>
これは、全てのリクエストに対する相対パスの基準点となる。<br>
<br>
<syntaxhighlight lang="nginx">
server {
    # ...略
    root /var/www/html;
}
</syntaxhighlight>
<br><br>
 
== indexディレクティブ ==
デフォルトページを指定する。<br>
指定順に検索され、最初に見つかったファイルが使用される。<br>
<br>
これは、locationコンテキストでも設定することができる。<br>
<br>
<syntaxhighlight lang="nginx">
server {
    # ...略
    index index.php index.html;
}
</syntaxhighlight>
<br><br>
 
== アクセス制御 ==
==== 許可 ====
特定のIPアドレス / 範囲からのアクセスを許可する。<br>
<syntaxhighlight lang="nginx">
allow 10.0.0.0/8;
</syntaxhighlight>
<br>
==== 拒否 ====
特定のIPアドレス / 範囲からのアクセスを禁止する。<br>
<syntaxhighlight lang="nginx">
deny 192.168.1.0/24;
</syntaxhighlight>
<br>
==== ファイルアップロード等の制限 ====
クライアントリクエストボディの最大サイズを指定する。<br>
<syntaxhighlight lang="nginx">
client_max_body_size 10M;  # 最大10[MB]に制限する場合
</syntaxhighlight>
<br><br>
 
== ログ設定 ==
サーバ固有のログフォーマットを指定する。<br>
serverコンテキストで設定することにより、特定の仮想ホストにのみ異なるログフォーマットを使用することができる。<br>
<br>
<syntaxhighlight lang="nginx">
# 以下の例では、custom_formatという名前のフォーマットを定義している
# 一般的なアクセスログの形式を定義しており、IPアドレス、時刻、リクエスト内容、ステータスコード、ユーザエージェント等の情報を記録している
server {
    log_format custom_format '$remote_addr - [$time_local] '
                          '"$request" $status $body_bytes_sent '
                          '"$http_referer" "$http_user_agent"';
    access_log /var/log/nginx/custom_access.log custom_format;
}
</syntaxhighlight>
<br>
これは、httpコンテキストでも定義することが可能である。<br>
その場合は、NginX全体の設定となる。(serverコンテキストで上書き可能)<br>
<syntaxhighlight lang="nginx">
http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';
    access_log /var/log/nginx/access.log main;
}
</syntaxhighlight>
<br>
==== アクセスログの保存先とフォーマットの指定 ====
<syntaxhighlight lang="nginx">
access_log /var/log/nginx/access.log main;
</syntaxhighlight>
<br>
==== エラーログの保存先とログレベルの指定 ====
<syntaxhighlight lang="nginx">
error_log /var/log/nginx/error.log warn;
</syntaxhighlight>
<br><br>
 
== タイムアウト関連 ==
==== client_body_timeoutディレクティブ ====
リクエストボディ受信のタイムアウトを指定する。<br>
これは、クライアントからのデータ受信間隔を制限する。<br>
<syntaxhighlight lang="nginx">
client_body_timeout 60s;
</syntaxhighlight>
<br>
==== client_header_timeoutディレクティブ ====
リクエストヘッダ受信のタイムアウトを指定する。<br>
これは、ヘッダ受信の制限時間のことである。<br>
<syntaxhighlight lang="nginx">
client_header_timeout 60s;
</syntaxhighlight>
<br>
==== keepalive_timeoutディレクティブ ====
Keep-Alive接続のタイムアウトを指定する。<br>
これは、持続的接続の維持時間のことである。<br>
<syntaxhighlight lang="nginx">
keepalive_timeout 75s;
</syntaxhighlight>
<br>
==== send_timeoutディレクティブ ====
レスポンス送信のタイムアウトを指定する。<br>
これは、クライアントへの送信処理のタイムアウトのことである。<br>
<syntaxhighlight lang="nginx">
send_timeout 60s;
</syntaxhighlight>
<br><br>
 
== バッファ設定 ==
==== client_body_buffer_sizeディレクティブ ====
リクエストボディのバッファサイズを指定する。<br>
<syntaxhighlight lang="nginx">
client_body_buffer_size 128k;
</syntaxhighlight>
<br>
==== client_header_buffer_sizeディレクティブ ====
リクエストヘッダのバッファサイズを指定する。<br>
<syntaxhighlight lang="nginx">
client_header_buffer_size 1k;
</syntaxhighlight>
<br>
==== large_client_header_buffersディレクティブ ====
大きなヘッダ用のバッファを指定する。<br>
<syntaxhighlight lang="nginx">
large_client_header_buffers 4 8k;
</syntaxhighlight>
<br><br>
 
== SSL / TLS設定ディレクティブ ==
==== ssl_certificateディレクティブ ====
SSL証明書ファイルのパスを指定する。<br>
ssl_certificate /path/cert.pem;
<br>
==== ssl_certificate_keyディレクティブ ====
秘密鍵ファイルのパスを指定する。<br>
<syntaxhighlight lang="nginx">
ssl_certificate_key /path/key.pem;
</syntaxhighlight>
<br>
==== ssl_protocolsディレクティブ ====
使用するSSL / TLSプロトコルを指定する。<br>
<syntaxhighlight lang="nginx">
ssl_protocols TLSv1.2 TLSv1.3;
</syntaxhighlight>
<br>
==== ssl_ciphersディレクティブ ====
暗号化スイートを指定する。<br>
<syntaxhighlight lang="nginx">
ssl_ciphers HIGH:!aNULL:!MD5;
</syntaxhighlight>
<br>
==== ssl_session_timeoutディレクティブ ====
SSLセッションのタイムアウトを指定する。<br>
<syntaxhighlight lang="nginx">
ssl_session_timeout 1d;
</syntaxhighlight>
<br>
==== ssl_session_cacheディレクティブ ====
SSLセッションキャッシュを設定する。<br>
<syntaxhighlight lang="nginx">
ssl_session_cache shared:SSL:50m;
</syntaxhighlight>
<br><br>
<br><br>



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

概要

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]に制限する場合



ログ設定

サーバ固有のログフォーマットを指定する。
serverコンテキストで設定することにより、特定の仮想ホストにのみ異なるログフォーマットを使用することができる。

 # 以下の例では、custom_formatという名前のフォーマットを定義している
 # 一般的なアクセスログの形式を定義しており、IPアドレス、時刻、リクエスト内容、ステータスコード、ユーザエージェント等の情報を記録している
 server {
    log_format custom_format '$remote_addr - [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent"';
 
    access_log /var/log/nginx/custom_access.log custom_format;
 }


これは、httpコンテキストでも定義することが可能である。
その場合は、NginX全体の設定となる。(serverコンテキストで上書き可能)

 http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';
 
    access_log /var/log/nginx/access.log main;
 }


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

 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;