:::: MENU ::::

SubversionでUnexpected HTTP status 413 'Request Entity Too Laege'が出たときの対処法(Apache2.0/2.2)

svn リポジトリからチェックアウトするときに 413 エラーが出るとの報告があったので、その対処法をメモしておく。

Unexpected HTTP status 413 'Request Entity Too Laege' on '/svn/hogehoge'

Apache2.2 以上の場合

ググると「SSLRenegBufferSize」を設定すればいいとある。

Description : Set the size for the SSL renegotiation buffer
Syntax      : SSLRenegBufferSize bytes
Default     : SSLRenegBufferSize 131072
Context     : directory, .htaccess
Override    : AuthConfig
Status      : Extension
Module      : mod_ssl

デフォルトが 128KB なので、これを大きくすればいいのだろう。
注意点としては Directory 記述の中か.htaccess の中に書かないと効果がないみたい。
で、たいてい有効化していると思うけど mod_ssl が必要。

<Directory '/var/repos/svn/'>
SSLRenegBufferSize 10485760
</Directory>

svn で使っている Directory 内に SSLRenegBufferSize を書いて 10MB を指定。
これで問題なく動くはず。

Apache2.0 の場合

続けて Apache2.0 で動いているサーバでも同じエラーが起きた。

こちらも同じように SSLRenegBufferSize を追加したら configtest でエラーが出た。

Invalid command 'SSLRenegBufferSize', perhaps misspelled or defined by a module not included in the server configuration Action 'configtest' failed.

mod_ssl も入れているし、記述もコピペでやったから間違ってない。。。
では何が問題なんだ?

相談しに行ったら、そもそも Apache2.0 だと使えないプロパティじゃないかと。

# strings modules/mod_ssl.so | grep SSLRenegBufferSize
# strings modules/mod_ssl.so | grep SSLRe
ssl_cmd_SSLRequireSSL
ssl_cmd_SSLRequire
SSLRequireSSL
SSLRequire
SSLRequire:

で、プロパティを調べてみたら Apache2.0 の mod_ssl には SSLRenegBufferSize なんてなかった……

さて、ではどうしましょうかと。
Apache2.2 系の mod_ssl を 2.0 でコンパイルしてみるという強攻策も考えたが、
どう考えてもコンパイル通りそうにないので却下。
それならばと mod_ssl のソース自体を書き換えてしまうことにする。

2.0 のソースをそれっぽい単語で grep 掛けても、
SSLRenegBufferSize を制御してそうな部分は見つけられなかったので、
2.2 のソースから調べて 2.0 の記述部分を探すことにする。

該当の記述を発見!!

# cd /usr/local/src/httpd-2.0.64/modules/ssl/
# vi ssl_engine_io.c
/* 128K maximum buffer size by default. */
#ifndef SSL_MAX_IO_BUFFER
#define SSL_MAX_IO_BUFFER (128 * 1024)
#endif

ここを書き換えて mod_ssl をコンパイル!

# cd /usr/local/src/httpd-2.0.64/modules/ssl/
# /usr/local/apache2/bin/apxs -i -a -c -D HAVE_OPENSSL=1 *.c
...
apxs:Error: Command failed with rc=65536

だが数多の警告とエラーでコンパイルできず。。。

よく分からなかったので Apache2.0 自体をコンパイルし直して、
必要な mod_ssl だけコピーして現行の Apache2.0 の mod_ssl に上書き。

# cd /usr/local/src/httpd-2.0.64/
# make clean
# CFLAGS="-DSSL_EXPERIMENTAL -DSSL_ENGINE" ./configure --prefix=/usr/local/apache2.0.64 --enable-mods-shared=most --enable-cgi --enable-cgid --enable-cache --enable-mem-cache --enable-proxy --enable-so --enable-deflate --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-ssl --with-ssl=/usr/local/openssl --with-mpm=prefork
# make -j3
# make install
# cp /usr/local/apache2.0.64/modules/mod_ssl.so /usr/local/apache2/modules/

これで SSL_MAX_IO_BUFFER が 10MB になったはず。
当面 413 エラーも出てないから、ちゃんと効果があったのだろう。