自前のプロキシサーバー(squid)経由ではてなブックマークページをみるとはてなスターが表示されない件

長いタイトルですな

とにかく我が家には現在サーバーとして動作している古いノートPCがありまして、色々な仕事をさせています。OSはCentOS release 5.3だったりします。彼の仕事範囲は骨董品になりつつある性能のわりには意外に広くて、主だったところを並べると、

  1. ドメインコントローラー(Samba)
  2. ネームサーバー(bind)
  3. プロキシサーバー(squid)

というところになります。
このなかでプロキシサーバーだけは今まで気分で使ったり使わなかったりしていたんですが、この度ブラウザをFireFoxからSafariに乗り換えるにあたって(Safari、はじめました)このプロキシサーバーのsquidをメインで使うことにしました。が、そこで問題が起きました。問題と言っても大した問題ではないのですが・・・それは
はてなブックマークの『人気エントリー』ページの『ブックマークページを見る時』、ブコメにスターが沢山ついていると『はてなスター』が全部表示されなくなる
というものです。これがはてなダイアリーのページであるとかであれば問題無くスターが表示されますし、プロキシ経由でなく直接見に行った場合も普通に表示されます。となるとこれは当然プロキシサーバーであるsquidに原因があるだろうということで、ちょっと調べて見ることにしました。・・・見えるはずのものが見えないのは気分が良くないですし。

という訳で

早速squidのログを見てみました。

$ tail -f /var/log/squid/access.log

とか実行しておいて、はてなブックマークの該当ページをブラウザで表示してみると、ログに露骨に一つだけ「DENIED」と表示される行がありました。長いので全部は載せませんが、以下のような感じです。

$ cat /var/log/squid/access.log | grep DENIED
TCP_DENIED/400 6304 GET http://s.hatena.ne.jp/entries.bookmark.json?&eid=(以下はてなユーザーのidがずらずらと20行くらいに渡って大量に列挙されているので略) - NONE/- text/html

もうどう考えてもこの異常なまでに長いURLリクエストが原因だと思ったのですが、確認のために/var/log/squid/cache.logも見てみると、

$ tail /var/log/squid/cache.log
urlParse: URL too large (7096 bytes)
urlParse: URL too large (4678 bytes)

とこんなメッセージが出ていました。やはりURLが長すぎるのが原因のようです。

長いURLを許可する設定は・・・?

じゃあどこにあるんだろうと思ってsquid.confを覗き込んで見たのですが・・・見あたらない。・・・ひょっとして、ない? そんな馬鹿な(結局見つからなかったのでどっかにあるのであれば教えて欲しいんですが)。という訳でgoogle先生に「urlParse: URL too large 」でお伺いを立ててみました。するとこんなページが見つかったのでフムフムと読んでいきますと・・・どうやらsquid2系ではURLが4096バイトまでと定義されているようです。正確にはsquid2.6までみたいですが。早速自前のsquidのバージョンを確認します。

$ squid -v
Squid Cache: Version 2.6.STABLE21

インストールされているsquidのバージョンは分かったので、これより上のバージョンがyumでインストール出来ないか調べてみました。

$ yum list | grep squid
squid.i386                               7:2.6.STABLE21-3.el5          installed

という訳でCentOS5.3でyum経由でインストール可能なのはsquidの2.6までのようです(多分)。早々にその辺りは諦めて、squidのページからソースを落としてビルドすることにしました。

$ cd /usr/local/src
$ wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE21.tar.gz 
$ tar -zxf squid-3.0.STABLE21.tar.gz
$ cd squid-3.0.STABLE21
$ ./configure --prefix=/usr/local/squid-3.0.20
$ make
$ make install

実際には途中でconfigureに失敗。よく考えたらコンパイラをインストールしていなかったので、別途インストールする。

$ yum -y install gcc
$ yum -y install gcc-c++

これで無事に/usr/local/squid-3.0.20にsquid3.0のインストールが成功しました。
一応展開されたソースコードを確認してみましたが、squid-3.0.STABLE21/src/define.hに確かにこのような記述がありました。

155 #define MAX_URL  8192

(確認はしていないので分かりませんが、yum経由でインストールされていたsquid2.6では、ここの数値が4096になっているのだと思います。ですので2.6でもここの数値を8192に書き換えてビルドすればいいんじゃないかと思います。というかそのうち試してみるかも)

後は

squidの設定ファイルを2.6の時と同じように書き換えて完了です。squid.confファイルの中身はかなり変わっていますが、指定するパラメータには大きな違いはないと思うので、多分困らないと思います。

$ cat squid.conf | grep -v "#" | sed -e '/^[ ]*$/d'

とかのコマンドを打てばコメントアウトされていない行を抜き出してみられるので(もっと簡単なコマンドもあるな、絶対)一応参考までに。で、後は新しくインストールされたsquid3.0を起動すれば完了です。
※追記のもっと簡単なコマンド(grepじゃなくてegrepでもOK)

cat /etc/squid/squid.conf | grep ^[^#]

ヘボでも正規表現を使うんだったらこう使えって感じですな・・・。上のコマンドではgrepに-vオプションを付けて結果を反転させてコメント行(#)以外を抜き出してから、sedコマンドとdオプションで空白行(^[ ]*$)を削除する、という面倒な事をやってます。比べて下はずっとシンプルで、行の先頭(^)が#以外([^#])をgrepで抜き出してます。なんでこんな簡単な事が思いつかないんだ俺は・・・orz

$ /usr/local/squid-3.0.20/sbin/squid -D
$ ps auxw | grep squid
root     15320  0.0  0.6   9916  1696 ?        Ss   04:32   0:00 /usr/local/squid-3.0.21/sbin/squid -D
squid    15322  0.0 18.0  52912 46172 ?        S    04:32   0:51 (squid) -D
squid    15323  0.0  0.3   2836   816 ?        S    04:32   0:00 (unlinkd)

squidの起動を確認したら(実はこの辺りで当初の目的を見失いかけていましたが)、はてなブックマークの「スターがついているはずなのに今までスターが表示されなかった」ページにアクセスします・・・おお! ちゃんとスターが表示されるようになった!
という訳で無事にスターも表示されて、squidも動きました。実際にはこれ以外にも、「新しいsquidの起動や停止を管理するのはどうやるのが一番いいかな?」とか「どーせsquidを本格的に使い出すならMRTGでHTTPリクエストのヒット率とか監視してみるか・・・」とか思ってSNMPやらMRTGやらもいろいろといじったんですが、ひとまずはここまで、という訳でこれでおしまいです。
・・・というかうちは何のブログなんだろうか・・・。