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