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をよく知らないので
このやり方を試してみて何が起きても知らないので、やってみる方は覚悟の上でやってみて下さい
つかアップデートする度に修正しなきゃだね・・・パッチにしてもいいけど・・・