読者です 読者をやめる 読者になる 読者になる

client_body_*

nginx

nginx研究。

client_body_*関連のパラメータを調整すると、メモリ内でのHTTP Request Bodyの扱い方を調整できるようだ。

たとえば、以下のようにclient_body_in_file_onlyとclient_body_temp_pathを両方とも設定すると、POST(やPUT)でコンテンツがポストされた時に、client_body_temp_pathで指定したディレクトリに内容がファイルに書き込まれる。

http {
        client_body_in_file_only on;
        client_body_temp_path /tmp/nginx;
}

中身を見てみると、こんな感じ。

# less /tmp/nginx/0000000004
content=aaaaaa&submit=%8F%91%82%AB%8D%9E%82%DE

client_body_in_file_onlyをonにしておくと、デバッグに便利かもしれない。

ドキュメントによると、このディレクティブを有効にしておかなくても、リクエストボディのサイズがclient_body_buffer_sizeを超えたならば、テンポラリファイルに内容を書き出す(はず。試していない。)

さらに、$request_body_fileという変数が定義されているので、次のようにproxy_set_headerを使えば、

http {
        client_body_in_file_only on;
        client_body_temp_path /tmp/nginx;
        server {
             proxy_set_header X-nginx-request-body-file $request_body_file;
        }
}

リバースプロキシの背後のサーバにテンポラリファイルのパスを渡すことができる。client_body_in_file_onlyにしておけば、テンポラリファイルと言っても勝手には消えないので、何かに利用できるかもしれない。(動画をアップロードして、エンコード結果は後で通知とか?いや、やっぱり使い道ないかも。)

client_body_in_file_onlyをonにしていると、すべてのリクエストがファイルに残ってしまうので、これが嫌ならば、locationの下にディレクティブを設定する。

http {
    server {
        location /upload {
             client_body_in_file_only on;
             client_body_temp_path /path/to/upload/directory;   
        }
}