すがブロ

sugamasaoのhatenablogだよ

CGIのリクエストパラメータ消失

Rubyを使ってるシステムで

クライアントからのリクエストがCGI側に到達したときに CGI::params でパラメータが受け取れないときがある。
環境依存だとは思うのだけど、一日に数回発生するのでこのまま見ないことにするわけにもいかないので、クソ忙しいなか調査している。

わかったこと

  • apache のログを見るに、apache まではリクエストが到達している
  • ruby側で CGIクラスから params を取得し、その値をチェックする段階では値が取得できていない

これから調べること

ruby の cgi.rb の initialize_query メソッドに無理くりログを吐かせる処理を入れて、どこまでパラメータが渡っているか白黒つける。
ここで入ってこなけりゃ mod_ruby*1 が何かやらかしているっぽい、と見当を付けることができるはずだ。

mod_ruby が悪かったとして

こちらで打つ手はあるのだろうか。正直、 Ruby の標準ライブラリに調査の手を入れ初めた時点でアプリ側ではどうにもならない部分な気もするが……。

ついでに mod_ruby についてちょっと調べる

なんとなく apache に組み込んで動作を早くするっていうイメージでしかわかっていなかったのでちょっと調べてみた。

んで、2つめの記事を見ていて気になったのだけど

CGI::Sessionが上手く動きません。

mod_rubyではCGI::Sessionは自動的にクローズされません。したがって明示的にクローズしてやる必要があります。

session = CGI::Session.new(...)
begin
  ...
ensure
  session.close
end

この問題はCGI::Session特有のものではありません。ファイルなども同様にクローズする必要があります。

こ、これ大丈夫か……? おれはフロントエンドばっかりやっていたのでサーバ側(Ruby側)の実装を良く見ていないんだけど、 mod_ruby を使ってる場合というのを意識して作らないといけないっぽいが……。

*1:書いてなかったけど、このシステムは mod_ruby で動いてます