nginxのデフォルトPOST値上限1MBを超えろ

nginxでファイルをアップロードする時に「413 Request Entity Too Large」とか「client intended to send too large body」
とかエラーが発生する事があります

これはPOST値サイズの上限がデフォルトでは1MBなので
confに「client_max_body_size 数字M」と指定すれば解決する話ですが
デフォルトで1MBは少なくない?と思ったのでソースレベルで弄ってみました
尚、この記事はnginx 1.9.10を元に書いています

先ず設定名のclient_max_body_sizeで検索
あった、3800辺りが怪しい
./src/http/ngx_http_core_module.c

ngx_conf_merge_off_value(conf->client_max_body_size,
   prev->client_max_body_size, 1 * 1024 * 1024);

3つ目の引数が恐らくデフォルトサイズ
という事でPHPの最大サイズである2GBにしてみた

ngx_conf_merge_off_value(conf->client_max_body_size,
   prev->client_max_body_size, 2 * 1024 * 1024 * 1024);

念のためデバッグ用に955辺りをこのように修正

ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
“client intended to send too large body: %O bytes %l”,
r->headers_in.content_length_n,
        clcf->client_max_body_size);

コンパイルしてインストールしてテストしてみると、怒られた
ログを見ると

client intended to send too large body: xxx bytes -2147483648

いかん、溢れている

という事は型が小さいみたい
という事でngx_conf_merge_off_valueを追っかけてみる

./src/core/ngx_conf_file.h
283行目辺り

#define ngx_conf_merge_off_value(conf, prev, default)
if (conf == NGX_CONF_UNSET) {
conf = (prev == NGX_CONF_UNSET) ? default : prev;
}

単純にconf->client_max_body_sizeに値を代入しているっぽいのでclient_max_body_sizeが定義されているところを探す

./src/http/ngx_http_core_module.h
の371行目辺りにありました

off_t client_max_body_size; /* client_max_body_size */

off_tは何ビットなのか調べてみると何も指定しない場合は32ビットとして定義される模様
http://d.hatena.ne.jp/shiku_otomiya/20091117/p1
stdio.hの前に

#define _FILE_OFFSET_BITS 64

を入れればいいそうだけど、OS毎に書かれているのにちと面倒・・・
ということで単純だけど

uint64_t client_max_body_size; /* client_max_body_size */

って書き直してコンパイルしてみた

テストした結果、デフォルト1MB以上行けたー!
という事なんですけど、当方Cをよく知らないので
このやり方を試してみて何が起きても知らないので、やってみる方は覚悟の上でやってみて下さい
つかアップデートする度に修正しなきゃだね・・・パッチにしてもいいけど・・・

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.