Как избежать ошибок nginx "upstream sent too large header"?
Я запускаю 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, эффект не имеет.
Как я могу отладить это?
Ответы
Ответ 1
Совсем недавно произошла ошибка.
Так как Passenger 3.0.8, теперь есть параметр, который позволяет вам устанавливать буферы и размер буфера. Итак, теперь вы можете сделать
http {
...
passenger_buffers 8 16k;
passenger_buffer_size 32k;
}
Это решило проблему для меня.
Ответ 2
Попробуйте добавить это в конфигурацию:
http {
...
proxy_buffers 8 16k;
proxy_buffer_size 32k;
}
Ответ 3
Maybee добавляет, что это сработает, как вы подключаетесь к восходящему потоку? http, fastcgi или что-то еще?
http {
...
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
}
Ответ 4
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
Ответ 5
Это все, что я узнал об этой ошибке за последние 2 года:
upstream sent too big header while reading response header from upstream
- это nginx общий способ сказать: "Мне не нравится то, что я вижу"
- Сбой потока восходящего сервера
- Сервер восходящего потока отправил неверный заголовок назад
- Уведомление/предупреждения, отправленные из 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
вы можете увидеть в третьей строке (из 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: проверьте или создайте журнал script, чтобы убедиться, что ваш поток достиг нужной конечной точки и не вышел до завершения.
Ответ 6
Я думал, что буду звонить с моим решением, так как я не вижу его в списке. Оказывается, я непреднамеренно помещал большой объект в сеанс, как показано ниже.
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
Все было хорошо, как только я удалил оскорбительную линию. Я предполагаю, что у меня было это там для целей отладки.