1. Qiita
  2. 投稿
  3. nginx

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

  • 34
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

背景

本番稼働させたアプリが予期せぬ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に一時的に値を保存するような処理中だとエラーが発生する(何かの登録処理など)

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