web-dev-qa-db-fra.com

Comment éviter les erreurs "En amont envoyé en-tête trop grand" de nginx?

Je lance nginx, Phusion Passenger and Rails.

Je me heurte à l'erreur suivante:

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

Cela se produit lors du rappel d'un appel d'authentification à Facebook Connect.

Après avoir googlé et essayé de modifier les paramètres nginx, notamment proxy_buffer_size et large_client_header_buffers, aucun effet n’est présent.

Comment puis-je déboguer cela?

29
Rob Watson

Je suis récemment tombé sur cette erreur.

Depuis Passenger 3.0.8 , il existe maintenant un paramètre qui vous permet de définir les tampons et leur taille. Alors maintenant tu peux faire

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

Cela a résolu le problème pour moi.

31
Rob Di Marco

Essayez d'ajouter ceci à la configuration:

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

Maybee ajoutant que cela le fera fonctionner, comment vous connectez-vous en amont? http, fastcgi ou autre chose?

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

Voici tout ce que j'ai compris de cette erreur au cours des 2 dernières années:

upstream sent too big header while reading response header from upstream est la manière générique de nginx de dire "je n'aime pas ce que je vois"

  1. Votre thread de serveur en amont s'est écrasé
  2. Le serveur en amont a renvoyé un en-tête non valide.
  3. La notification/les avertissements renvoyés par STDERR ont cassé leur tampon et ont été fermés, ainsi que STDOUT.

3: Regardez les journaux des erreurs au-dessus du message. Est-ce que le flux est en cours avec les lignes journalisées précédant le message? PHP message: PHP Notice: Undefined index: Exemple d'extrait d'une boucle mon fichier journal:

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

vous pouvez voir sur la 3ème ligne (parmi les 20 erreurs précédentes) que la limite de mémoire tampon a été atteinte, cassée, et que le thread suivant l'a écrasée. Nginx a ensuite fermé la connexion et renvoyé 502 au client.

2: enregistrez tous les en-têtes envoyés par demande, vérifiez-les et assurez-vous qu'ils sont conformes aux normes (nginx n'autorise pas les fichiers de plus de 24 heures à supprimer/supprimer un cookie, en envoyant une longueur de contenu non valide car les messages d'erreur étaient mis en mémoire tampon avant que le contenu soit compté. ..)

les exemples comprennent:

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

et ça:

<?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: vérifiez ou créez un journal de script pour vous assurer que votre thread atteint le bon point final et ne quitte pas avant la fin.

1
ppostma1

Je pensais mettre ma solution au point car je ne la vois pas actuellement dans la liste. Il se trouve que je mettais involontairement un objet de grande taille dans la session, comme indiqué ci-dessous.

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

Cela ne s'est produit que lorsque quelqu'un s'est authentifié pour la première fois auprès de GitHub OAuth et a ensuite tenté de s'authentifier avec un autre profil social utilisant le même courrier électronique (pourquoi je ne pouvais pas comprendre le problème à l'origine).

Voici la OmniauthCallbacksController complète pour la référence contextuelle:

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

Tout allait bien une fois que j'ai supprimé la ligne fautive. Je devine que je l'avais là pour des raisons de débogage.

0
aaronbartell