これ、今後リリースするアプリは毎回注意しなきゃなと思いました。
背景
本番稼働させたアプリが予期せぬ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.conf
のhttp{}
の中に以下の設定を追加するだけで直りました。
デフォルトのproxy bufferのサイズを超えていたようです。
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
暫定ですが、上記の値にしました。
session storeをcookieからactiverecordに変更
必ずしもactiverecordでなくてもいいです。memcachedやredisでもいいと思います。とにかくcookie以外で。
Rails4からはgemを入れないとだめだそうです。
+gem 'activerecord-session_store'
session storeを変更します。
-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に一時的に値を保存するような処理中だとエラーが発生する(何かの登録処理など)
大規模になってしまってからはやりづらいので最初から行っておきたいですね。