nginx で a client request body is buffered to a temporary file の警告に対応してみる
以下のような警告メッセージが出力されていたので、今回は、これに対処してみました。
2013/04/08 09:50:49 [warn] 1190#0: *295230 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000001818, client: 192.168.1.100, server: www.example.com, request: "POST /xxxx/ HTTP/1.1", host: "www.example.com", referrer: "http://www.example.com/xxxx/"
|
a client request body is buffered to a temporary file 警告メッセージに対応してみる
この警告メッセージの意味は、以下のように意味になります。
クライアントリクエストボディのバッファをテンポラリファイル(../0000001818)に行った
つまりは、要求しているバッファサイズが、指定されているメモリ量では不足しているので、テンポラリファイルを使いますよ・・・という警告?
なので、この警告の対処として、以下の2つが考えられます。
- クライアントリクエストボディのメモリサイズを拡大する
クライアントリクエストボディのメモリサイズは、client_body_buffer_size
ディレクティブで設定することができます。
以下は、その設定例です。
...
http {
...
client_body_buffer_size 32k;
...
}
|
client_body_buffer_size
[形式] : client_body_buffer_size the_size
[デフォルト] : 8k/16k
[使えるディレクティブの範囲] :
このディレクティブは、以下のディレクティブ内で使用できます。
[概要] :
このディレクティブはクライアントリクエストボディのバッファサイズを指定します。
リクエストボディがこのバッファよりも大きい時はリクエストボディ全体もしくは一部が一時ファイルに書きこまれます。
デフォルトのサイズは ページサイズの2倍と同じで、これはプラットフォームによりますが 8K もしくは 16K になります。
ページサイズは、各プラットフォームで異なります。Linuxでのページサイズの確認は、以下のように行うことができます。
$ getconf PAGE_SIZE
4096
|
この場合、デフォルトは 8k となります。
- この警告を無視する
この警告メッセージは、そもそも テンポラリファイルを使ってバッファリングが行われたものであって、
その制御に誤りや、動作に不具合があったわけではありません。
そこで、要求処理が、速度を求められていない場合においては、ファイルを使ったバッファリングでも問題はないはずで、
実際に警告が出たURLを確認し、表示速度、リアクションの速度を求めないのなら、ファイルへのバッファでも問題ないと思われます。
また、当然ながら、速さが求められた場合は、上記のclient_body_buffer_size
で対応すべきでしょう。
client_body_temp_path について(おまけ)
client_body_buffer_size
といっしょに確認、設定しておきたいディレクティブが、client_body_temp_path
です。
以下は、その設定例です。
...
http {
...
client_body_buffer_size 32k;
client_body_temp_path /var/cache/nginx/client_temp;
...
}
|
client_body_temp_path
[形式] : client_body_temp_path path [ level1 [ level2 [ level3 ]]]
[デフォルト] :
configure
で設定されたパスになりますので、
nginx -V
で確認することができます。
$ nginx -V
nginx version: nginx/1.2.8
TLS SNI support enabled
configure arguments: \
--prefix=/etc/nginx \
...
--http-client-body-temp-path=/var/cache/nginx/client_temp \
...
|
上記の例では、
/var/cache/nginx/client_temp
になります。
[使えるディレクティブの範囲] :
このディレクティブは、以下のディレクティブ内で使用できます。
[概要] :
このディレクティブはリクエストのボディとともに一時ファイルをを保存するためのディレクトリを指定します。
dir-path にてサブディレクトリの階層を三階層まで設定可能です。
例
client_body_temp_path /spool/nginx/client_temp 1 2;
|
ディレクトリ構造は次のようになります:
/spool/nginx/client_temp/7/45/00000123457
|
client_body_temp_path
の設定を誤っていると、以下のような重大なエラー([crit])が出力される場合があります。
2012/06/30 23:40:19 [crit] 1190#0: *295230 open() /var/cache/nginx/client_temp//0000009328" failed (2: No such file or directory), client: 192.168.1.100, server: www.example.com, request: "POST /xxxx/ HTTP/1.1", host: "www.example.com", referrer: "http://www.example.com/xxxx/"
|
クライアントリクエストボディサイズは、要は、文字通りクライアントからの要求処理に必要なメモリ(バッファ)サイズになります。
CMSなどを使っていると、それなりに必要となるので、よく上記の警告メッセージが出力されることがあります。
それでも、せいぜい 30k – 60k 程度のサイズで概ね大丈夫でしょう。
それでも必要な場合は、詳細な情報を確認すべきでしょうね。要求バッファでメモリを消費しすぎると、サーバーへの負荷が大きくなります。
気を付けましょうね。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :