upstream sent too big header while reading response header from upstream(Nginx/Rails)

スポンサーリンク
スポンサーリンク
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました

Rails アプリケーションを動かしている Nginx サーバーの production 環境で、502 エラーが発生したので原因を探りました。

Nginx のエラーログを確認

まずは、Nginx のエラーログを確認しました。

上記のように、

というエラーメッセージが沢山記録されていた。訳しますと…

「upstream からレスポンスヘッダーを読み出す際に、upstream が大きすぎるヘッダーを送信しています」とのことで、クッキーのデータが大きすぎたのが原因っぽい。

スポンサーリンク

ということで、以下2つの対策を行いました。

セッション管理を cookie store から active record store に変更

Rails アプリケーションのセッション管理を、クッキーに保存から ActiveRecord に保存するように変更しました。作業手順の詳細は以下記事を参考。

Rails4でsession storeをActiveRecordに変更 | EasyRamble

activerecord-session_store という gem を利用します。

Nginx 設定ファイルを編集

unicorn をアプリケーションサーバー、Nginx をリバースプロキシとして利用している環境だったので、Nginx の設定ファイルでプロキシされたサーバー(unicorn)からのレスポンスを読むためのバッファーサイズ等の調節を行いました。

nginx.conf

デフォルトより大きい値を指定した。proxy_buffer_size などの詳細については以下参考。

Module ngx_http_proxy_module
Nginx をリバースプロキシ(キャッシュ) として使ってみた|レンタルサーバー・自宅サーバー設定・構築のヒント

nginx.conf の調節については、セッション管理を ActiveRecord で行うの場合は、なくても良さそう。事実、activerecord-session_store 導入だけで、Nginx の「upstream sent too big header」エラーは発生しなくなりました。ということで、proxy_buffer_size 等の設定は最終的には元に戻しました。

以上の対応で、表題の Nginx エラーは発生しなくなった。

スポンサーリンク
サーバ構築研究会の CentOS 本は、昔からお世話になっています。Linux の教科書は Linux の基本を学ぶのにおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!