Nginx 499 códigos de error
http-headers uwsgi (9)
... vino aquí desde una búsqueda en Google
Encontré la respuesta en otro lugar aquí -> https://stackoverflow.com/a/15621223/1093174
que era elevar la conexión de tiempo de inactividad de mi equilibrador de carga elástico AWS!
(Había configurado un sitio de Django con el proxy inverso nginx / apache, y un trabajo / vista de inicio de sesión muy real era el tiempo de espera)
Recibo muchos códigos de error 499 nginx. Veo que este es un problema del lado del cliente. No es un problema con Nginx o mi stack uWSGI. Observo la correlación en los registros de uWSGI cuando obtengo un 499.
address space usage: 383692800 bytes/365MB} {rss usage: 167038976
bytes/159MB} [pid: 16614|app: 0|req: 74184/222373] 74.125.191.16 ()
{36 vars in 481 bytes} [Fri Oct 19 10:07:07 2012] POST /bidder/ =>
generated 0 bytes in 8 msecs (HTTP/1.1 200) 1 headers in 59 bytes (1
switches on core 1760)
SIGPIPE: writing to a closed pipe/socket/fd (probably the client
disconnected) on request /bidder/ (ip 74.125.xxx.xxx) !!!
Fri Oct 19 10:07:07 2012 - write(): Broken pipe [proto/uwsgi.c line
143] during POST /bidder/ (74.125.xxx.xxx)
IOError: write error
Estoy buscando una explicación más profunda y esperando que no haya nada de malo en mi configuración de nginx para uwsgi. Lo estoy tomando en valor nominal ... no es un problema mío ... es un problema para el cliente.
Gracias
En mi caso, estaba impaciente y terminé malinterpretando el registro.
De hecho, el problema real era la comunicación entre nginx y uwsgi, y no entre el navegador y nginx. Si cargué el sitio en mi navegador y esperé lo suficiente, obtendría un "504 - Bad Gateway". Pero me tomó tanto tiempo, que seguí intentando cosas y luego actualicé en el navegador. Así que nunca esperé el tiempo suficiente para ver el error 504. Al actualizar en el navegador, es cuando se cierra la solicitud anterior, y Nginx escribe eso en el registro como 499.
Elaboración
Aquí asumiré que el lector sabe tan poco como yo, cuando comencé a jugar.
Mi configuración era un proxy inverso, el servidor nginx y un servidor de aplicaciones, el servidor uWSGI detrás de él. Toda solicitud del cliente iría al servidor nginx, luego se reenviaría al servidor uWSGI, y luego se enviaría una respuesta de la misma manera. Creo que así es como todos usan nginx / uwsgi, y se supone que deben usarlo.
Mi nginx funcionó como debería, pero algo estaba mal con el servidor uwsgi. Hay dos formas (tal vez más) en las que el servidor uwsgi puede no responder al servidor nginx.
1) uWSGI dice: "Estoy procesando, solo espere y pronto obtendrá una respuesta". nginx tiene un cierto período de tiempo, que está dispuesto a esperar, fx 20 segundos. Después de eso, responderá al cliente, con un error 504.
2) uWSGI está muerto, o UWSGi muere mientras nginx lo está esperando. nginx ve eso de inmediato, y en ese caso devuelve un error 499.
Estaba probando mi configuración haciendo solicitudes en el cliente (navegador). En el navegador no pasó nada, simplemente siguió colgando. Después de quizás 10 segundos (menos que el tiempo de espera), llegué a la conclusión de que algo no estaba bien (lo cual era cierto), y cerré el servidor uWSGI desde la línea de comandos. Luego iría a la configuración uWSGI, probar algo nuevo y luego reiniciar el servidor uWSGI. En el momento en que cerré el servidor uWSGI, el servidor nginx devolvería un error 499.
Así que seguí depurando con el Erroe 499, eso significa buscar el error 499 en Google. Pero si hubiera esperado lo suficiente, habría obtenido el error 504. Si hubiera obtenido el error 504, habría sido capaz de entender mejor el problema y luego poder depurarlo.
Entonces, la conclusión es que el problema fue con uWGSI, que siguió en suspenso ("Espera un poco más, solo un poco más, entonces tendré una respuesta para ti ...").
Cómo solucioné ese problema, no lo recuerdo. Supongo que podría ser causado por muchas cosas.
Este error es bastante fácil de reproducir usando la configuración estándar de nginx con php-fpm.
Mantener presionado el botón F5 en una página creará docenas de solicitudes de actualización para el servidor. Cada solicitud anterior es cancelada por el navegador en la nueva actualización. En mi caso, encontré docenas de 499 en el archivo de registro de la tienda en línea de mi cliente. Desde un punto de vista nginx: si la respuesta no se entregó al cliente antes de la siguiente solicitud de actualización, nginx registra el error 499.
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:32 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:33 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:33 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:33 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:33 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:34 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:34 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:34 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:34 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:35 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
mydomain.com.log:84.240.77.112 - - [19/Jun/2018:09:07:35 +0200] "GET /(path) HTTP/2.0" 499 0 "-" (user-agent-string)
Si el procesamiento de php-fpm toma más tiempo (como una página de WP pesados), puede causar problemas, por supuesto. He oído hablar de bloqueos de php-fpm, por ejemplo, pero creo que se puede evitar la configuración adecuada de los servicios, como el manejo de llamadas a xmlrpc.php.
HTTP 499 en Nginx significa que el cliente cerró la conexión antes de que el servidor respondiera la solicitud. En mi experiencia suele ser causada por el tiempo de espera del lado del cliente . Como sé, es un código de error específico de Nginx.
Me encontré con este problema y la causa se debió al complemento Kaspersky Protection en el navegador. Si te encuentras con esto, intenta deshabilitar tus complementos y ver si eso soluciona el problema.
Muchos casos causan el error 499, uno de mi caso es, el campo Content-Length se perdió en la solicitud http de un cliente pocco
Una de las razones de este comportamiento podría ser que está utilizando http
para uwsgi
lugar de socket
. Utilice el siguiente comando si está usando uwsgi
directamente.
uwsgi --socket :8080 --module app-name.wsgi
El mismo comando en el archivo .ini es
chdir = /path/to/app/folder
socket = :8080
module = app-name.wsgi
Una vez que obtuve 499 "la solicitud ha sido prohibida por el antivirus" como una respuesta HTTP AJAX (falso positivo por Kaspersky Internet Security con análisis heurístico ligero, el análisis heurístico profundo sabía correctamente que no había nada de malo).
¿El cliente cerró la conexión no significa que sea un problema del navegador? ¡De ningún modo!
Puede encontrar errores 499 en un archivo de registro si tiene un LB (equilibrador de carga) delante de su servidor web (nginx) AWS o haproxy (personalizado). Dicho esto, el LB actuará como un cliente de nginx.
Si ejecuta valores predeterminados de haproxy para:
timeout client 60000
timeout server 60000
Eso significaría que LB se desconectará después de 60000ms si no responde desde nginx. Los tiempos de espera pueden ocurrir para sitios web ocupados o scripts que necesitan más tiempo para la ejecución. Necesitarás encontrar el tiempo de espera que funcione para ti. Por ejemplo extiéndalo a:
timeout client 180s
timeout server 180s
Y probablemente estarás configurado.
Dependiendo de su configuración, es posible que vea un error de tiempo de espera de la puerta de enlace 504 en su navegador que indica que algo está mal con php-fpm, pero ese no será el caso con los errores 499 en sus archivos de registro.