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

スポンサーリンク

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

Nginx のエラーログを確認

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

上記のように、

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

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

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

ということで、以下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 の基本を学ぶのにおすすめです。
 
スポンサーリンク

Leave Your Message!