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?
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.
Essayez d'ajouter ceci à la configuration:
http {
...
proxy_buffers 8 16k;
proxy_buffer_size 32k;
}
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;
}
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
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"
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.
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.