LoginSignup
38

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-14

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

背景

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38