Nginx: 502 Bad Gateway
— 2869 hitsHe tenido que lidiar con un escenario bastante interesante como sysadmin, al menos me ha tenido entretenido durante algún tiempo, cosa que últimamente estaba echando de menos. Empezando por la moraleja tengo que decir que debemos tener cuidado con los datos de sesión cuando utilizamos Nginx como proxy transparente hacia Apache.
En este caso concreto se trata de un simple captcha. Nginx escuchando en el 80 actuando como proxy transparente a un Apache en el 8080 con mod_php entre otras cosas. El código php que inserta valores en sesión es el siguiente:
// Preguntas y respuestas para Captcha
$preguntas = array ("¿Qué idioma se usa en España?", "¿Otra?");
$respuestas = array (0 => array("español"), 1=>array("respuesta"));
$ci->session->set_userdata(array('captcha_pregunta'=>$preguntas[0]));
$ci->session->set_userdata(array('captcha_respuestas'=>$respuestas[0]));
return $preguntas[$num];
Bien, pues cuando el array de respuestas tiene un caracter raro (ñ, tildes...), Nginx nos ofrece un 502 Bad Gateway. Es curioso porque no pasa lo mismo con el array de preguntas, sólo con el de respuestas. Cambiando, por ejemplo "español" por "castellano" todo parece funcionar de forma adecuada.
No tengo ni idea del motivo por el que sucede ésto, y sé que cambiar la respuesta no es la mejor de las soluciones pero cuando el tiempo aprieta... es lo que hay. Cualquier comentario al respecto será bienvenido.
Comentarios
Si recibes un 502 yo diría que el problema no es de nginx sino que nginx no puede acceder a aquello a lo que está sirviendo de proxy (upstream).
El código de las preguntas y las respuestas no es equivalente: uno es una array de cadenas de texto y el otro es un array de arrays (que tienen una sola cadena de texto).
Yo investigaría la respuesta de upstream, mirando toda la respuesta HTTP. Algo hace que nginx piensa que upstream no funciona correctamente y devuelva ese 502.
Voto por lo que recomienda reidrac: analizar el trafico. Apuntado a las cabezeras que denoten codifcacion. Puede ser que pidas una codificacion que no esta soportada por el upstream, o el upstream responda lo que le de la gana y nginx salte con un error.
Se me pasa por la cabeza incluso el parametro de calidad: http://www.w3.org/Protocols/rf...