Rails
nginx

Railsを本番稼働させるときはnginxとsession storeの設定に注意

More than 3 years have passed since last update.

これ、今後リリースするアプリは毎回注意しなきゃなと思いました。


背景

本番稼働させたアプリが予期せぬ502や、Railsのエラーが出るようになってしまいました。

何かと思って調べたら以下の2つのエラーが出ていました。


nginx

upstream sent too big header while reading response header from upstream


rails

ActionDispatch::Cookies::CookieOverflow

それぞれ上限値を越えてしまったために、出たエラーです。

回避する設定は以下。

※追記(2014/04/15 21:00)

そもそもnginxでheaderがデカイって怒られている原因はcookieに一杯値が入っていただけで、その原因はsessionに値をたくさん突っ込むようなことをしていたからなので、そもそもその時点で問題があります。

今回は一度nginxのエラーを解消しなければcookieの問題も気が付かなかったのですが、session storeをcookie以外にした時点でnginxのproxy bufferの設定は不要かなと思いました。

ということで、nginxの設定については蛇足ですね。


nginxのproxy bufferの設定

参考

参考URLの用にnginx.confhttp{}の中に以下の設定を追加するだけで直りました。

デフォルトのproxy bufferのサイズを超えていたようです。


nginx.conf

proxy_buffer_size   128k;

proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

暫定ですが、上記の値にしました。


session storeをcookieからactiverecordに変更

必ずしもactiverecordでなくてもいいです。memcachedやredisでもいいと思います。とにかくcookie以外で。

参考

Rails4からはgemを入れないとだめだそうです。


Gemfile

+gem 'activerecord-session_store'


session storeを変更します。


config/initializers/session_store.rb

-YourAppName::Application.config.session_store :cookie_store, key: '_your_app_name_session'

+YourAppName::Application.config.session_store :active_record_store, key: '_your_app_name_session'

$ bundle install

$ rails g active_record:session_migration
$ rake db:migrate
※本番リリース時はRAILS_ENV=productionをつける

あとは再起動して終了です。

懸念としては、


  • 現在ログインしているユーザーはログアウトしてしまう

  • sessionに一時的に値を保存するような処理中だとエラーが発生する(何かの登録処理など)

大規模になってしまってからはやりづらいので最初から行っておきたいですね。