生まれて初めてApacheのモジュールを作ってみた。
http://github.com/komamitsu/mod_memc_sess

WebアプリでApacheをフロントにして後ろのRailsとかにリバースプロキシする際、性能のことを考えてあげると画像とかの静的ファイルはApacheに配信してもらいたいのだけど、ログイン認証をしているのに静的ファイルはスルーっていうのは宜しくないので、Railsにて認証したあとにsend_fileしたりすることがある。

でも、いちいち画像ファイルのダウンロード位で重たいRailsの手を煩わせるのも何だかなぁ、という。機密情報が含まれていればちょっと話は別だけど。

というわけで、有効なセッションが有るか?くらいの簡単なチェックをしたいなぁ、と思ったのと何よりもApacheのモジュールを作ったことが無かったので試しに作ってみたかった、ので作りました。セッションの格納場所としてMemcachedが好きなので、それ専用です。

冒頭の「生まれて初めて」というのは、ここ最近、そんな台詞を吐いたことがないので是非隙あらば発していきたいという気持ちの現れです。


このモジュールの使い方について…

まず、Rails側で

ActionController::Base.session = {
  :memcache_server => 'localhost:11211',
  :expire_after => 86400,
  :namespace => "test_memc_sess",
}
ActionController::Base.session_store = :mem_cache_store

みたいに設定(config/initializers/session_store.rb)してある場合、Memcachedには、

<32 set test_memc_sess:f340524c9b1f4308545ea1e20ef0b9c5 0 86400 4
> NOT FOUND test_memc_sess:f340524c9b1f4308545ea1e20ef0b9c5
>32 STORED

というふうにKey-Valueが登録されて、HTTP上のCookieとしては

Cookie: _session_id=f340524c9b1f4308545ea1e20ef0b9c5

みたいに飛んでいるので、Apacheの設定として

<Location "/images">
  MemcSessServer localhost:11211
  MemcSessCookieName _session_id
  MemcSessMemcKeyPrefix test_memc_sess:
</Location>

としてやると、http://hoge.ho.ge/images/foobar.png のアクセスに対して

  • RailsへのアクセスによりMemcachedにセッションができる前は401
  • RailsにアクセスしてMemcachedにセッションができると200

という簡単なアクセス制御ができます。

あ、Railsはログイン画面にアクセスしただけでセッションが出来ちゃうから、ちゃんとログイン後のみセッションが生成されるようにいじっておくことが前提です。


今回、ちょっとモジュールを作ってみて思ったことは…

  • やっぱりモジュール作成のお作法的な何かはちゃんと調べる必要がある。とくにフック関数が呼ばれるタイミングとメモリプール回り
  • Cookieを扱うときはlibapreq2が無いと辛そう. まぁap_regexec()があるからそれらしく動くのはかけると思うけど
  • makeコマンドでbuildしたい場合、apxs -gで吐き出されるMakefileはあんまり使えない. 今回は結局autoconfも絡めつつ自分で書いた

みたいな。