概要
みなさんこんにちはcandleです。今回はmemcachedサーバを利用してrailsのセッションを管理してみたいと思います。
一般にrailsでセッション管理をしていると、ブラウザのcookieに保存されます。
下のサンプルはdeviseでログインした時のsessionの情報です。
cookieにありますね。
それをmemcachedで管理してみたいと思います。
cookieで管理しない理由としては処理速度が速いとか、個々の機種に依存しないとかだと思います。
前提
memcachedサーバを立てている
立てていない人はこのブログの下の記事を参照してください。
Ubuntuにmemcachedをインストールする方法と動作確認
dalliをインストールする
適当なrailsプロジェクトで、Gemfileを開いて下の記述をしましょう。
gem "dalli"
そしたら、下のコマンドでdalliをrailsプロジェクトにインストールします。
bundle install
これでインストールされました。
memcachedを立ち上げる
railsアプリケーションと同じサーバにmemcachedサーバを立てても、良いのですが、冗長性が無いので、railsアプリケーションが動いているサーバとmemcachedサーバを別にして設定してみたいと思います。
railsアプリケーションを動かしているサーバとは別のPCでmemcachedを動かしましょう。
やり方として、同じLANの中の別のサーバかvirtual boxにmemcachedサーバをたてましょう。
私は同じLANの別のMacサーバ上で動かします。
まずはmemcachedサーバのプライベートIPアドレスを調べます。
ifconfig
私のmemcachedのサーバのIPアドレスは192.168.2.115ですね。
把握できたので、memcachedサーバを動かします。
macの場合ですとlaunchctlで既に起動している場合があります。
下のコマンドで実行中のmemcachedサーバを見れます。
ps aux | grep memcached
もしも実行されているならば止めてください。
brewでmemcachedを入れているなら、下のコマンドでサーバを起動します。
memcached -vv
すると、memcachedのリアルタイムのアクセスが見れます。
これでmemcached側の設定は終わりです。
rails側の設定
rails側では先ほどdalliを入れました。
config/environments/development.rbを開きます。
もしも本番環境でやるなら、config/environments/production.rbを開きます。私は開発環境でやるのでdevelopment.rbに下の内容を書き込みます。
config.cache_store = :dalli_store, 'cache-1.example.com', 'cache-2.example.com', { :namespace => NAME_OF_RAILS_APP, :expires_in => 1.day, :compress => true }
自分の場合だと、ですね。
config.cache_store = :dalli_store, '192.168.2.115', '192.168.2.115', { :namespace => Bootstrap3, :expires_in => 1.day, :compress => true }
注意点としては、:namespaceのアプリの名前の頭文字は大文字から始まります。
次に、config/initializers/session_store.rbを開きます。
デフォルトだと、cookieになっていると思います。
Bootstrap3::Application.config.session_store :cookie_store, key: '_bootstrap3_session'
これをコメントアウトして、下の記述を書き込みます。
Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 1.day
こんな感じですね。
設定は以上です。
ということで、railsサーバを立ち上げてみましょう。
bundle exec rails s
deviseでログインしてみましょう。
すると、memcachedに反応があります。
どうやら、sessionがmemcachedに保存されているらしいですね。
ページのキャッシュとかもそっちに保存されているらしく噂の通り20倍くらい早い気がします。
まとめ
設定のあたりで一度躓いてしまい大変でしたが出来てしまえば案外楽でした。
質問などがあれば下のコメント欄かtiwtterでお願いします。