この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ロードバランサーによくPoundを使用しますが、うっかりしてるととんでもない落とし穴にはまります。
ある日出社すると、、、
Mさん「テスト環境でちゃんと動作する検索フォームが本番環境だと動きません。どうやらPoundがHTTPヘッダーを2048byteしか受け取れないみたいです。Apacheは4096byte受けてるのでロードバンラサーをかましてないテストではうまくいっちゃてるみたいです。」
「おはようございます」を交わす前にこんな会話からはじまるのでした。
よくよく調べると同じ症状で困ってる先人方がたくさんおりました。
つまりGETリクエストにあまりに長いクエリーを突っ込んだり、2kbを超えるようなCookieを仕込むと「長すぎるよ」って怒られるようです。
この怒られる限度が2kbか4kbの差で挙動が変わるようです。
最新のバージョンでは改善されているようですが、CentOS を使用していた関係上yum管理のものを入れておいたほうがよいだろうと rpmforge から入れた 2.4.3-1.el5.rf を使用していました。
対処法1:最新版のソースからコンパイルして入れ替える。
対処法2:新し目のrpmを探してきて入れ替える。
今回はやっぱりrpmでいれておきたいので対処法2を模索しました。
新し目のバージョンのrpm はここから拾えます。
今回はCentOS5.4なのでEPEL 5なPound-2.4.4-1.el5.x86_64.rpmで良いでしょう。
HTTPヘッダーのサイズはPoundヘッダーソースファイル内(pound.h)に
#define MAXBUF 2048
のように定義してあるのでMAXBUFが4096であることを確認する為に、Pound-2.4.4-1.el5.src.rpmも落としてソースを確認します。
2.4.4-1.el5は MAXBUF 4096 だったのでこれなら問題は起きないはずです。
rpmforgeから入れた2.4.3-1.el5.rfからはアップデートできなかったので一度削除。
# yum remove pound -y
それからダウンロードしてきた物をインストール
# yum install Pound-2.4.4-1.el5.x86_64.rpm --nogpgcheck -y
以上を入れなおした結果、Poundを経由しても問題の長いGETクエリー(4kb以下)を発行する検索フォームも動作するようになりました。