Jak uniknąć błędów nginx "upstream sent too big header"?

Prowadzę nginx, Phusion Passenger i Rails.

Napotkałem następujący błąd:

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

Występuje podczas połączenia zwrotnego z połączenia uwierzytelniającego do Facebook Connect.

Po wygooglowaniu i próbie zmiany ustawień nginx, w tym proxy_buffer_size i large_client_header_buffers, nie ma żadnego efektu.

Jak mogę to debugować?

Author: Rob Watson, 2010-02-21

6 answers

Natknąłem się na ten błąd niedawno.

OdPassenger 3.0.8 istnieje teraz ustawienie, które pozwala ustawić bufory i rozmiar bufora. So now you can do

http {
    ...
    passenger_buffers 8 16k;
    passenger_buffer_size 32k;
}
To rozwiązało problem.
 31
Author: Rob Di Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 17:37:16

Spróbuj dodać to do config:

http {
    ...
    proxy_buffers 8 16k;
    proxy_buffer_size 32k;
    }
 28
Author: Antiarchitect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-21 23:46:04

Może dodanie tego sprawi, że będzie działać, jak połączyć się z upstream? http, fastcgi czy coś innego?

http {
    ...
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
}
 24
Author: Linus Unnebäck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-15 14:55:43
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
 6
Author: Unitech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 19:27:34

To wszystko, co zrozumiałem o tym błędzie w ciągu ostatnich 2 lat:

upstream sent too big header while reading response header from upstream jest to ogólny sposób na powiedzenie "nie podoba mi się to, co widzę".]}

  1. Twój wątek serwera upstream uległ awarii
  2. Serwer wysyłający nieprawidłowy nagłówek z powrotem
  3. powiadomienia / Ostrzeżenia wysłane ze STDERR przerwały ich bufor i zarówno on, jak i STDOUT zostały zamknięte

3: spójrz na dzienniki błędów nad wiadomością, czy jest strumieniowany z zalogowanymi liniami poprzedzająca wiadomość? PHP message: PHP Notice: Undefined index: Przykładowy fragment z pętli mój plik dziennika:

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

Możesz zobaczyć w trzeciej linii (z 20 poprzednich błędów) limit bufora został uderzony, złamany, a następny wątek napisał nad nim. Następnie Nginx zamknął połączenie i zwrócił 502 do klienta.

2: zapisuj wszystkie nagłówki wysłane na żądanie, przejrzyj je i upewnij się, że są zgodne ze standardami (nginx nie pozwala niczego starszemu niż 24 godziny na usunięcie/wygaśnięcie pliku cookie, wysyłając nieprawidłową długość treści ponieważ komunikaty o błędach były buforowane przed zliczeniem zawartości...)

Przykłady:

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

I to:

<?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: zweryfikuj lub utwórz dziennik skryptu, aby upewnić się, że wątek osiąga właściwy punkt końcowy i nie kończy się przed zakończeniem.

 1
Author: ppostma1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 18:33:48

Pomyślałem, że skorzystam z mojego rozwiązania, ponieważ nie widzę go obecnie na liście. Okazuje się, że nieumyślnie wkładałem duży obiekt do sesji, jak pokazano poniżej.

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

Stało się to tylko wtedy, gdy ktoś najpierw uwierzytelnił się za pomocą GitHub OAuth, a następnie próbował uwierzytelnić za pomocą innego profilu społecznościowego, który używał tego samego e-maila (dlaczego początkowo nie mogłem rozgryźć problemu).

Oto pełna OmniauthCallbacksController dla odniesienia kontekstowego:

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
Wszystko było dobrze. raz usunąłem linię obrażeń. Zgaduję, że miałem go tam w celach debugowania.
 0
Author: aaronbartell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 15:34:28