Railsの複数サーバーをPoundでまとめてセッション共有するためには
とあるシステムで、シングル・サインオンでのサーバー連携だけでいいと思っていたが、システム管理メニューなどの関係でセッションの共有まで行わなければならないことが判明した。
そこで、Railsの複数サーバーをPoundでまとめてセッション共有する方法を調べてみる。
とりあえず、以下のページを見つけた。
- ドメインの異なるサイトでセッションを共有する - RubyBeginner (ルビギナー)の世にも奇妙な開発 (http://d.hatena.ne.jp/sai-ou89/20080827/1219846572)
でもこれってRails2系からできることみたい。(ちょっと嵌まってしまった)やっぱり、Rails2系に上げなければならないか・・・対応費用がでない・・・って思ったけど、これはRails2系のデフォルトのセッションの格納先がクッキーだからであって、Rails1系の場合はデータベースにセッションを格納すればいいってことがわかった。もちろん、Poundで同一ドメインの処理を複数のサーバーに振り分けている場合だけどね。
で、参照したページ。
- railsのクッキーとセッションについてまとめ - おもしろWEBサービス開発日記 (http://d.hatena.ne.jp/willnet/20080531/1212239850)
下記rakeコマンドで、sessionsテーブルを作成するマイグレーションを作成し、マイグレーションする。ただし、実行環境にあわせて RAILS_ENV=production とかしてね。
rake db:sessions:create
rake db:migrate
config/environment.rbのRails::Initializer.run do |config|の中の下記の部分がコメントアウトになっていると思うので、それを有効にすること。
config.action_controller.session_store = :active_record_store
これで、複数サーバーでもデータベースを介して同一のセッション情報を参照できるようになる。これって、Rails1系はファイルでのセッション管理だからで、Rails2系ではクッキーだからこんなことはしなくてもいいかも知れない。
あと、自前のセッションストアとしてこんなページも見つけた。
- Railsで自前のセッションストアを作ってみる | やむにやまれず (http://blog.livedoor.jp/sparklegate/archives/50276412.html)
それと、あまり言及されているところが少なかっが、定期的にセッションを消す必要があると思う。
そこで、こんなページを見つけた。
- セッションを定期的に削除する - アイディアがカタチになるまで (http://d.hatena.ne.jp/realizeidea/20080516/1210953271)
- Ruby onRails セッションをDBで管理 - chihiro_69の日記 (http://d.hatena.ne.jp/chihiro_69/20080227)
- Ruby on Railsを勉強中です。 セッション情報はDB(active_record_store)に格納しているのですが、このセッション情報のうち古いもの(1日前とか)を定期的に削除するにはどの.. - 人力検索はてな (http://q.hatena.ne.jp/1220439906)
で、下記を/etc/cron.dailyに配置って感じかな・・・?
実際はcronなんかで実行すると思いますが、その場合はscript/runnerを使うとよいと思います。
#!/bin/sh
cd path/to/app
ruby script/runner 'CGI::Session::ActiveRecordStore::Session.delete_all(["sessions.updated_at < ?", 1.days.ago])'