2010-02-21 17 views
29

Estoy ejecutando nginx, Phusion Passenger y Rails.Cómo evitar los errores de nginx "encabezado enviado demasiado grande"?

estoy corriendo contra el error siguiente:

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 

Se está produciendo en la devolución de llamada de una llamada a la autenticación de Facebook Connect.

Después de googlear, y tratando de cambiar la configuración de nginx incluyendo proxy_buffer_size y large_client_header_buffers no tiene ningún efecto.

¿Cómo puedo depurar esto?

Respuesta

31

Encontré este error recientemente.

Desde Passenger 3.0.8 ahora hay una configuración que le permite configurar los búferes y el tamaño del búfer. Así que ahora puede hacer

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

Eso resolvió el problema para mí.

+2

+1 Esta debería ser la respuesta aceptada. –

28

tratar de añadir esto a la config:

http { 
    ... 
    proxy_buffers 8 16k; 
    proxy_buffer_size 32k; 
    } 
+0

ya que está usando Phusion Passenger encima de nginx, su solución NO lo ayudará. porque su mensaje de error citado arriba proviene del pasajero mismo y casi definitivamente no de nginx directamente. Sin embargo, podría ser seguro seguir haciendo lo que usted dijo, pero también agregar los dos colgantes de pasajeros (passenger_buffers & passenger_buffer_size) como se indica a continuación. – christianparpart

+2

@trapni Puede que no ayude a responder esta pregunta, pero también es una solución para otras personas que usan nginx proxy –

+4

Esto definitivamente ayudó cuando se usa unicornio detrás de nginx. – Lloeki

24

Maybee añadiendo esto hará que funcione, ¿cómo se conecta a aguas arriba? http, fastcgi o algo más?

http { 
    ... 
    fastcgi_buffers 8 16k; 
    fastcgi_buffer_size 32k; 
} 
+0

phusion pasajero no está utilizando fastcgi en absoluto, es una parte directa del proceso nginx, por lo que esto no ayudará a todos en su caso. – christianparpart

+0

¡Oh mierda! Tienes toda la razón, error estúpido de mi parte :) –

+7

Gracias por esto. Funcionó muy bien para mi implementación fastcgi. –

6
fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k; 
1

Esto es todo lo que he llegado a entender acerca de este error en los últimos 2 años:

upstream sent too big header while reading response header from upstream es de forma genérica nginx de decir "No me gusta lo que estoy viendo"

  1. su hilo servidor en sentido ascendente se estrelló
  2. El servidor envió una cabecera de aguas arriba no válido volver
  3. El Aviso/advertencias enviadas desde STDERR rompieron su tampón a nd it y STDOUT estaban cerrados

3: Mire los registros de errores que se encuentran arriba del mensaje, ¿está transmitiendo con líneas registradas que preceden al mensaje? PHP message: PHP Notice: Undefined index: Fragmentos de ejemplo de un bucle de mi archivo de registro:

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 

se puede ver en la línea de tercera (de los 20 errores anteriores) fue alcanzado el límite de búfer, se rompió, y el siguiente hilo escribió en sobre ella. Nginx luego cerró la conexión y devolvió 502 al cliente.

2: registre todos los encabezados enviados por solicitud, revíselos y asegúrese de que se ajusten a las normas (nginx no permite nada más de 24 horas eliminar/expirar una cookie, enviando contenido inválido porque los mensajes de error se almacenaron antes el contenido cuenta ...)

ejemplos incluyen:

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

y esto:

<?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: verificar, o hacer un registro de la escritura, para asegurar el hilo está alcanzando el punto final correcta y no salir antes de su finalización .

0

Pensé en responder con mi solución ya que actualmente no la veo en la lista. Resulta que involuntariamente puse un objeto grande en la sesión, como se muestra a continuación.

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

esto sólo ocurrió cuando alguien autenticado primero con GitHub OAuth y posteriormente intentó autenticarse con otro perfil social que utiliza el mismo correo electrónico (por qué no podía imaginar originalmente el tema).

Aquí está la completa OmniauthCallbacksController de referencia contextual:

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 

Todo estaba bien una vez me quita la línea en cuestión. Supongo que lo tenía allí para propósitos de depuración.

Cuestiones relacionadas