東京福袋・人気投票改修リポート

宇仁菅真さんのインタビューの時をはじめ、普段からお世話になりっぱなしの東京福袋主催・みやしたさんに誉めていただき(こちら)、大照れの私。いやはや、私なんざダラダラとやってるだけですからねぇ、「鑑」だなんてとんでもない。「きょういくてれびのたまてばこ」をはじめ、優良ETVページは他にもたくさんあります。とはいえ、こんな私のページでも期待して下さる方がいてくれるというのは嬉しいものです。本当にありがとうございます。これからも初心を忘れず、精進していきますのでよろしくお願いいたします。

ところで、パルタいいですね(笑)。プチアニメの中でも大好きです。ページ作りたいけど資料ないんで‥ちなみにプチアニメは私よりかみさんのが熱心に見てます。で、「宇宙人→ロボット→宇宙人」(本人気付いてなかった(^^;)ときて、次は‥「妖怪」で「あいうえお:波瀬ファンページ」なんてどうでしょう(うそ)。残念、ファンじゃないからなぁ(笑)。

#そういう意味で、学校放送の中で「あいうえお」が一番SF色が強いと思ってます(笑)


ちと横道にそれてしまいましたが、そんなお世話になっている東京福袋の人気ページ・おねえさんミシュランでこの度第2回おねえさん人気投票が始まりました。早速私もナナに投票すべく行ってみたんですが、どうも投票できなかったんです。そこでみやしたさんに問い合わせてみたところ、「他の方からも同様の問い合わせがあったのだが、原因がわからない」との連絡が。ここはひとつ日頃お世話になっているお礼も兼ね、調査しましょう!と非力ながら改修役をかって出ました。


(本件のためしばらく投票は止まっていましたが、改修は終わり現在復旧している筈です。皆さんも贔屓のおねえさんに投票しましょう(^_^)。)


以下に、今回投票システムがうまく動かなかった原因と改修内容を示します。特にリムネットでCGI/SSIを使用している方にはちっとはお役に立てるかと思います。
(一部専門用語を解説なしで使用していますがご了承下さい)

  • 不具合内容
  • 「おねえさん人気投票」では、西田 貴洋さん作の「T-Vote Limit」(言語:Perl)を使用している。T-Vote Limitは投票制限付きのCGI投票システムで、接続元のIPアドレスを利用して投票の回数制限をしている。IPアドレスは環境変数「REMOTE_ADDR」より取得している。

    今回起きた不具合は、この接続元IPアドレスが正しく取得できていないというもの。何処からアクセスしても特定のIPアドレスとして認識されてしまうため、まだ未投票なのに投票が無効になってしまうといった現象が起きた。


  • 不具合の原因
  • 現在リムネットでは全サーバにキャッシュサーバ(stドメインは Squid Cache 1.0.22)を導入しており、この環境下でCGIに渡される REMOTE_ADDR はキャッシュサーバのアドレスになる。このため、おねえさん人気投票システム上では毎回ほぼ同じアドレスしか認識されていなかった(キャッシュサーバが複数あるようなので、必ず同じという訳でもなかった様子)。

    この様な理由なので、T-Vote Limitの不具合ではない。


  • 改修内容
  • キャッシュサーバ導入環境下では、接続元IPアドレスの取得に「HTTP_FORWARDED」という別の環境変数を用いることで、キャッシュサーバ非導入環境下での REMOTE_ADDR を取得できる。ただし、 HTTP_FORWARDED は下記のような形式のため、文字列加工が必要。

     by http://cache.st.rim.or.jp:80/ (Squid/1.0.22) for XXX.XXX.XXX.XXX
     (XXX.XXX.XXX.XXX がREMOTE_ADDRに該当する値)


    今回は単純に文字列を" "(スペース)で区切り、最後の要素を取り出すような処理をT-Vote Limitの該当箇所に加えた。

      ### $ipaddr=$ENV{'REMOTE_ADDR'};                 # 修正前の処理
      @TFTMP  = split(' ',$ENV{'HTTP_FORWARDED'});     # 修正後の処理-1
      $ipaddr = $TFTMP[$#TFTMP];                       # 修正後の処理-2
    

    (もっといいやり方がありそうなんだけどとりあえずこれしか思いかなかった(^^;)

− 以 上 −


今回のような現象は、例えば「REMOTE_ADDRを参照して直前と同じアドレスだったらカウントアップしないアクセスカウンタ」とかにもろ影響が出ます。キャッシュサーバ導入後、ちっともカウンタ値があがらない〜なんてことになります(ちなみに私が使用しているアクセスカウンタもこんな仕様ですが、So-netはcacheがないので今のところ大丈夫)。

今回の「HTTP_FORWARDED」を使う方法以外にも、「REMOTE_HOST」(これは接続元のホスト名がくるらしい)を利用してDNSからIPアドレスを引くという方法もあることはあるんですが、DNSの負荷があがるからおすすめではないとのことです。そりゃそうだ。

という訳で、キャッシュサーバについてはあまり良く知らなかった私にとっては有益なノウハウとなりました。怪我の功名ですかね。でも比較的はやく原因がわかって良かったです。