web-dev-qa-db-ja.com

nginxの「アップストリームが大きすぎるヘッダーを送信しました」エラーを回避するにはどうすればよいですか?

私はnginx、Phusion Passenger、Railsを実行しています。

私は次のエラーに直面しています:

upstream sent too big header while reading response header from upstream, client: 87.194.2.18, server: xyz.com, request: "POST /user_session HTTP/1.1", upstream: "passenger://unix:/tmp/passenger.3322/master/helper_server.sock

これは、FacebookConnectへの認証呼び出しからのコールバックで発生しています。

グーグルした後、proxy_buffer_sizeやlarge_client_header_buffersなどのnginx設定を変更しようとしても効果がありません。

どうすればこれをデバッグできますか?

29
Rob Watson

最近このエラーに遭遇しました。

Passenger 3.0.8 以降、バッファとバッファサイズを設定できる設定があります。だから今あなたはすることができます

http {
    ...
    passenger_buffers 8 16k;
    passenger_buffer_size 32k;
}

それで問題は解決しました。

31
Rob Di Marco

これを構成に追加してみてください:

http {
    ...
    proxy_buffers 8 16k;
    proxy_buffer_size 32k;
    }
28
Antiarchitect

Maybeeがこれを追加すると機能しますが、アップストリームにどのように接続していますか? http、fastcgiまたは何か他のもの?

http {
    ...
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
}
24
Linus Unnebäck
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
6
Unitech

これが、過去2年間にこのエラーについて私が理解するようになったすべてです。

upstream sent too big header while reading response header from upstreamは、「私が見ているものが気に入らない」というnginxの一般的な言い方です。

  1. アップストリームサーバースレッドがクラッシュしました
  2. アップストリームサーバーが無効なヘッダーを送り返しました
  3. STDERRから返送された通知/警告がバッファを壊し、STDOUTとSTDOUTの両方が閉じられました

3:メッセージの上のエラーログを見てください。メッセージの前にログが記録された行でストリーミングされていますか? PHP message: PHP Notice: Undefined index:ログファイルのループからのスニペットの例:

2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
... // 20 lines of same
PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:
2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "ta_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Firstname

3行目(前の20個のエラーから)で、バッファー制限に達し、壊れて、次のスレッドがそれを上書きしたことがわかります。その後、Nginxは接続を閉じ、502をクライアントに返しました。

2:リクエストごとに送信されたすべてのヘッダーをログに記録し、それらを確認して、標準に準拠していることを確認します(nginxは、コンテンツがカウントされる前にエラーメッセージがバッファリングされたため、24時間より古いCookieの削除/期限切れを許可せず、無効なコンテンツ長を送信します。 ..)

例は次のとおりです。

<?php
//expire cookie
setcookie ( 'bookmark', '', strtotime('2012-01-01 00:00:00') );
// nginx will refuse this header response, too far past to accept
....
?>

この:

<?php
header('Content-type: image/jpg');
?>

<?php   //a space was injected into the output above this line
header('Content-length: ' . filesize('image.jpg') );
echo file_get_contents('image.jpg');
// error! the response is now 1-byte longer than header!!
?>

1:スレッドが正しいエンドポイントに到達し、完了する前に終了しないことを確認するか、スクリプトログを作成します。

1
ppostma1

現在リストされていないので、自分のソリューションを試してみようと思いました。以下に示すように、意図せずに大きなオブジェクトをセッションに入れていたことがわかりました。

session["devise.#{provider}_data"] = env["omniauth.auth"]

これは、誰かが最初にGitHub OAuthで認証し、その後、同じ電子メールを使用する別のソーシャルプロファイルで認証しようとしたときにのみ発生しました(なぜ私は最初に問題を理解できなかったのですか)。

コンテキスト参照用の完全なOmniauthCallbacksControllerは次のとおりです。

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def self.provides_callback_for(provider)
    class_eval %Q{
      def #{provider}
        @user = User.from_omniauth(request.env["omniauth.auth"])
        if @user.persisted?
          sign_in_and_redirect @user, event: :authentication
          set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
        else
          auth = request.env["omniauth.auth"]
          if User.exists?(email: auth.info.email)
            set_flash_message(:notice, :failure, kind: "#{provider}".capitalize, reason: "email " + auth.info.email + " already exists") if is_navigational_format?
          else
            set_flash_message(:notice, :error, kind: "#{provider}".capitalize) if is_navigational_format?
          end
          session["devise.#{provider}_data"] = env["omniauth.auth"] <----- Remove this line
          redirect_to new_user_registration_path
        end
      end
    }
  end

  [:github, :linkedin, :google_oauth2].each do |provider|
    provides_callback_for provider
  end
end

問題のある行を削除すると、すべてが順調でした。私はデバッグの目的でそこにそれを持っていたと思います。

0
aaronbartell