AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Nginx の client_max_body_size と client_body_buffer_size の設定を雑にやる

実際どうすりゃいいの? というの、調べてもまあわりと具体的に書いてないので雑にやる。

まあこんなもん個々人の環境によるから、書きようがないので心持ちの話だよ。

client_max_body_size

1 リクエストあたりでアップロードできる (扱える) 最大ファイルサイズです。

デフォルト値は 1M。

例えば複数ファイルアップロードできる CMS とかだと、 20M のファイル 5 つ添付したらそれで一杯です。 そういう感じで設定してください。

どんくらい設定してんの?

だいたいのサービス、初期は「そんなの見積もれないよ〜」と泣き言を言うので、入力側 UI か API で制限しろや! と思いつつ、僕はいつも 100M で設定します。

client_body_buffer_size

1 リクエストでメモリにバッファリングできる最大サイズです。

デフォルトは OS というかアーキテクチャによって異なるそうですが、 8K もしくは 16K だそうです。

client_max_body_size と微妙にニュアンスが似ていますが、client_max_body_size > client_body_buffer_size となった時、あふれた分がディスクに temp ファイルとして書き出されます。 雰囲気的にはスラッシングってやつですね。

メモリから溢れちゃうとディスク I/O が発生して処理速度に影響するので、なるべく一度のリクエストで扱えるファイルが全部バッファに乗るようにすると良いですね。

どんくらい設定してんの?

だいたいのサービス、初期は「そんなの見積もれないよ〜」と泣き言を言うので、入力側 UI か API で制限しろや! と思いつつ、僕はいつも設定していません。

client_max_body_size とは違い、設定していないからといって制限が出るものでもないので。 適切に要件出してくれないなら性能を犠牲にするしかない、という気持ちを持っていけ。

最適化する時は、 client_max_body_size と同じ値を書いておくと全部メモリにバッファリングできてマルいです。

つまり?

とりあえずはこんな感じでデフォルト投下しておくと具合が良いでしょう。

概ね添付ファイルを扱う所への同時アクセスが 5 〜 10 程度で、Nginx が常時メモリを 1G 〜 確保しようとする想定です。

添付ファイルのサイズや数が増える (機能として指定される) と、そこから「どのくらい設定すればいいか」というのが仮定でも設定できるようになるので、仕様策定は大事、というオチで申し訳ないけど。

インスタンスやコンテナ全体の RAM が 2G 以下
server {
        client_max_body_size 10M;
        client_body_buffer_size 10M;
}
インスタンスやコンテナ全体の RAM が 4G 以下
server {
        client_max_body_size 100M;
        client_body_buffer_size 100M;
}

参考

SPDY 設定していると以下のような話もあるので、環境によっては tempfs 使う場合など注意する必要があります。

qiita.com