:::: MENU ::::

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

Pocket

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
mod_ssl – Apache HTTP Server Version 2.2

デフォルトが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エラーも出てないから、ちゃんと効果があったのだろう。

Pocket


So, what do you think ?