Как избежать ошибок nginx "upstream sent too big header"? - PullRequest
29 голосов
/ 21 февраля 2010

Я использую 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

Это происходит при обратном вызове из аутентификационного звонка в Facebook Connect.

После поиска в Google и попытки изменить настройки nginx, включая proxy_buffer_size и large_client_header_buffers, не действуют.

Как мне отладить это?

Ответы [ 6 ]

31 голосов
/ 26 сентября 2011

Недавно сталкивался с этой ошибкой.

Начиная с Passenger 3.0.8 теперь есть настройка, позволяющая установить буферы и размер буфера. Так что теперь вы можете сделать

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

Это решило проблему для меня.

28 голосов
/ 22 февраля 2010

Попробуйте добавить это в конфиг:

http {
    ...
    proxy_buffers 8 16k;
    proxy_buffer_size 32k;
    }
24 голосов
/ 15 августа 2011

Может быть, добавление этого заставит его работать, как вы подключаетесь к апстриму? http, fastcgi или что-то еще?

http {
    ...
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
}
6 голосов
/ 17 января 2012
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
1 голос
/ 18 сентября 2013

Это все, что я понял об этой ошибке за последние 2 года:

upstream sent too big header while reading response header from upstream - это общий способ nginx сказать: «Мне не нравится то, что я вижу»

  1. Сбой потока вашего вышестоящего сервера
  2. вышестоящий сервер отправил неверный заголовок обратно
  3. Уведомление / Предупреждения, отправленные обратно из STDERR, сломали их буфер, и оба, и 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 не разрешает удалять / истекать cookie-файлы старше 24 часов, отправляя недопустимую длину содержимого, поскольку сообщения об ошибках были буферизованы до содержание учтено ...)

примеры включают в себя:

<?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: проверьте или создайте журнал сценария, чтобы убедиться, что ваш поток достигает правильной конечной точки и не завершает работу до завершения.

0 голосов
/ 20 мая 2016

Я подумал, что я должен принять решение, так как я не вижу его в списке. Оказывается, я непреднамеренно помещал большой объект в сеанс, как показано ниже.

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

Все было хорошо, как только я убрал оскорбительную строку. Я предполагаю, что у меня это было там для целей отладки.

...