RailsでDBセッションを使う

Post date: 2009/05/19 9:49:31

Status: 500 Internal Server Error

ActionController::Session::CookieStore::CookieOverflow

というエラーが出るようになったので、セッションデータをDBにストアするよう変更する。

CookieStoreは、 セッションデータをサーバ上のファイルやDBに保存する代りに、クッキー自体に保存する。 このため、セッションデータの読み書きのコストが減ったり、古いセッションデータ の掃除の手間がなくなる、という利点があるとのことだが、容量が4kしかないらしい。

必要な変更:

  1. config/environment.rbで以下の行をアンコメントする:

    1. config.action_controller.session_store = :active_record_store

  2. 以下を実行してセッション格納用テーブルを作成する

    1. rake db:sessions:create

    2. rake db:migrate

  3. app/controllers/application.rbで以下のような部分で、:secret前のコメントを外す:

    1. protect_from_forgery # :secret => '6d0b20bbf9203508337aff3214f79efb7a0'

sessionsの肥大化を防ぐ [2020−3−8追記]

https://github.com/rails/activerecord-session_store に書いてあるように、crontabなどでdb:sessions:trimする必要ある。

ただし、これを実行しても、MYSQLのテーブル sessions.ibdは小さくならない。これを物理的に小さくするには、https://www.forknerds.com/reduce-the-size-of-mysql/ にあるように、optimize tableする。具体的には

mysql -u root -p で入り

use alb_production;

optimize table sessions;