RailsのセッションをRedisに保存する (1)
November 10, 2017
デプロイ中にセッションを飛ばさないために、 セッションをアプリケーション外に保存するケースがあります。 今回はそういったケースのために、 Rails のセッションを Redis に保存できる redis-store/redis-rails を使ってみました。
まずは素の Rails プロジェクトを作成
まずは素の Rails プロジェクトを作成します。 最初のウェルカムページだけだとセッションが生成されないので、 今回は Todo 管理システムを作るということにして、 Scaffold を使っていきます。 ちなみに Rails のバージョンは 5.1.4 を使っていきます。
$ rails new redis-rails-sample --skip-bundle --skip-turbolinks
$ cd redis-rails-sample
$ bundle install --path vendor/bundle
$ rails g scaffold Task title:string status:integer
redis-rails をインストール
次にredis-store/redis-railsを
インストールして設定を書いていきます。
Gemfile にgem 'redis-rails'
と書いて、bundle install
を実行します。
次にconfig/application.rb
を以下のように編集します。
module RedisRailsSample
class Application < Rails::Application
# ...
# これを追記
config.cache_store = :redis_store, "redis://localhost:6379/0/cache", { expires_in: 90.minutes }
end
end
最後にconfig/initializers/session_store.rb
というファイルを作成し、
以下の内容にします。
RedisRailsSample::Application.config.session_store :redis_store, {
servers: [
{
host: "localhost",
port: 6379,
db: 0,
namespace: "session"
},
],
key: "_#{Rails.application.class.parent_name.downcase}_session"
}
Redis にセッションが保存されるか確認
ローカルで Redis と Rails を立ち上げて、ブラウザで
http://localhost:3000/tasks
にアクセスしてみましょう。
ちなみにここで(error) DENIED Redis is running in protected mode because protected mode is enabled ~
というエラーが発生する場合は、下記を参考にしてください。
redis で because protected mode is enabled が出た場合の対処 - Qiita
redis-cli
を使って Redis の中身を確認すると、セッションが保存されているのが確認できます。
$ redis-cli
127.0.0.1:6379> keys *
1) "session:d473262d9ea737183cfea7327c7abb2e"
127.0.0.1:6379> get session:d473262d9ea737183cfea7327c7abb2e
"\x04\b{\x06I\"\x10_csrf_token\x06:\x06EFI\"1OVi9+6AQ8dkLwHvPbYSacBuAgtnkPKp9A+cHUBrYwEQ=\x06;\x00F"
セッションの有効期限を設定する
上記の設定だと Redis に溜まったデータが削除されず、メモリが不足してしまいます。
確認したい場合はブラウザの開発ツールで cookie を削除してページにアクセスするのを繰り返してみてください。 前のセッションが破棄されず Redis に溜まっていくのが確認できます。
先ほど作成したconfig/initializers/session_store.rb
に 1 行追加して、
セッションの有効期限を設定しましょう。
RedisRailsSample::Application.config.session_store :redis_store, {
servers: [
{
host: "localhost",
port: 6379,
db: 0,
namespace: "session"
},
],
# 以下の行を追記
expire_after: 1.minute, # 本番では1.weekなどにすると良いでしょう
key: "_#{Rails.application.class.parent_name.downcase}_session"
}
ここでもう一度 Redis と Rails を立ち上げ
http://localhost:3000/tasks
にアクセスしてみると、
同じようにセッションが保存されていますが、
今度は有効期限が設定されているのが分かります。
127.0.0.1:6379> keys *
1) "session:244f74bbe23995aedc7624eeafe2131d"
127.0.0.1:6379> ttl session:244f74bbe23995aedc7624eeafe2131d
(integer) 51
おわりに
以上、簡単でしたがredis-store/redis-rails を使ってみました。 次回は有名な認証機能のライブラリであるplataformatec/devise と組み合わせた挙動を確認していきたいと思います。