json - tengo - La respuesta del servidor se corta a la mitad
tengo mucha tos y no puedo dormir (7)
error.log
mi archivo nginx error.log
y encontré lo siguiente:
13870 open() "/var/lib/nginx/tmp/proxy/9/00/0000000009" failed (13: Permission denied) while reading upstream...
Parece que el proxy de nginx intentaba guardar el contenido de respuesta (pasado por thin) a un archivo. Solo lo hace cuando el tamaño de la respuesta excede proxy_buffers
(64 proxy_buffers
por defecto en la plataforma de 64 bits). Entonces, al final, el error se conectó a mi tamaño de respuesta de solicitud.
Terminé arreglando mi problema al off
proxy_buffering
en mi archivo nginx config, en lugar de subir proxy_buffers
o arreglar el problema de permiso de archivo.
Aún no estoy seguro sobre el propósito del buffer de nginx. Agradecería que alguien pudiera sumar eso. ¿Deshabilitar completamente el almacenamiento en memoria intermedia es una mala idea?
Tengo una API REST que devuelve respuestas json. A veces (y lo que parece ser completamente al azar), la respuesta json se corta a la mitad. Entonces, la cadena json devuelta se ve así:
...route_short_name":"135","route_long_name":"Secte // end of response
Estoy bastante seguro de que no es un problema de codificación porque el punto de corte cambia continuamente de posición, dependiendo de la cadena json que se devuelve. No he encontrado un tamaño de respuesta particular para el cual ocurre el corte (he visto que 65kb no se cortan, mientras que 40kbs lo hacen).
Mirando el encabezado de respuesta cuando ocurre el corte:
{
"Cache-Control" = "must-revalidate, private, max-age=0";
Connection = "keep-alive";
"Content-Type" = "application/json; charset=utf-8";
Date = "Fri, 11 May 2012 19:58:36 GMT";
Etag = "/"f36e55529c131f9c043b01e965e5f291/"";
Server = "nginx/1.0.14";
"Transfer-Encoding" = Identity;
"X-Rack-Cache" = miss;
"X-Runtime" = "0.739158";
"X-UA-Compatible" = "IE=Edge,chrome=1";
}
Tampoco suena una campana. ¿Nadie?
Yo tuve el mismo problema:
Nginx cortó algunas respuestas del backend de FastCGI. Por ejemplo, no pude generar una copia de seguridad SQL adecuada desde PhpMyAdmin. Revisé los registros y encontré esto:
2012/10/15 02:28:14 [crit] 16443 # 0: * 14534527 open () "/ usr / local / nginx / fastcgi_temp / 4/81/0000004814" error (13: Permiso denegado) durante la lectura en sentido ascendente, cliente : *, servidor:, solicitud: "POST / HTTP / 1.1", flujo ascendente: "fastcgi: //127.0.0.1: 9000", host: "", referente: "http: // * / server_export.php? token = ** "
Todo lo que tuve que hacer para solucionarlo fue otorgar los permisos adecuados a la carpeta /usr/local/nginx/fastcgi_temp
, así como a client_body_temp
.
¡Fijo!
Muchas gracias samvermette , su pregunta y respuesta me puso en el camino correcto.
Tuve un problema similar con la respuesta de corte del servidor.
Sucedió solo cuando agregué el encabezado json antes de devolver el header(''Content-type: application/json'');
respuesta header(''Content-type: application/json'');
En mi caso, gzip
causó el problema.
Lo resolví especificando gzip_types
en nginx.conf
y agregando application/json
a list antes de activar gzip
:
gzip_types text / plain text / html text / css application / x-javascript text / xml application / xml application / xml + rss text / javascript application / json;
gzip on;
Es posible que se haya quedado sin inodos, lo que impide que NginX use el directorio fastcgi_temp correctamente.
Prueba df -i
y si tienes 0% de inodos gratis, eso es un problema.
Intente find /tmp -mtime 10
(más de 10 días) para ver qué podría estar llenando su disco.
O tal vez es otro directorio con demasiados archivos. Por ejemplo, vaya a /home/www-data/example.com y cuente los archivos:
find . -print | wc -l
Gracias por la pregunta y las excelentes respuestas, me ahorró mucho tiempo. Al final, la respuesta de clement y sam me ayudó a resolver mi problema, por lo que los créditos van para ellos.
Solo quería señalar que después de leer un poco sobre el tema, parece que no se recomienda deshabilitar proxy_buffering
ya que podría hacer que el servidor se detenga si los clientes (el usuario de su sistema) tienen una mala conexión a Internet, por ejemplo.
Encontré esta discusión muy útil para entender más. El ejemplo de Francis Daly me lo dejó muy claro:
Quizás es más fácil pensar en el proceso completo como una cadena de procesos.
el navegador web habla con nginx, en un enlace de 1 MB / s. nginx habla con el servidor en sentido ascendente, en un enlace de 100 MB / s. servidor upstream devuelve 100 MB de contenido a nginx. nginx devuelve 100 MB de contenido al navegador web.
Con proxy_buffering activado, nginx puede contener los 100 MB completos, por lo que la conexión nginx-upstream se puede cerrar después de 1 s, y luego nginx puede pasar 100 s enviando el contenido al navegador web.
Con proxy_buffering desactivado, nginx solo puede tomar el contenido de la versión anterior a la misma velocidad que nginx puede enviarlo al navegador web.
El navegador web no se preocupa por la diferencia, todavía le toma 100 s obtener todo el contenido.
A nginx no le importa mucho la diferencia: aún demora 100 s en alimentar el contenido al navegador, pero tiene que mantener la conexión abierta durante 99 s adicionales.
A Upstream le importa la diferencia: lo que podría haberle costado 1 s en realidad lleva 100 s; y para los 99 s adicionales, ese servidor en sentido ascendente no está atendiendo ninguna otra solicitud.
Por lo general: el enlace nginx-upstream es más rápido que el enlace browser-nginx; y el upstream es más "pesado" que nginx; por lo tanto, es prudente dejar que el proceso de acabado aguas arriba sea lo más rápido posible.
Tuvimos un problema similar. Fue causado por nuestro servidor REST (DropWizard) que tiene habilitado SO_LINGER. Bajo carga DropWizard estaba desconectando NGINX antes de que tuviera la posibilidad de descargar sus memorias intermedias. El JSON era> 8kb y el extremo frontal lo recibiría truncado.
También he tenido este problema: el análisis de JSON
del lado del cliente estaba defectuoso, la respuesta se estaba cortando o, peor aún, la respuesta era obsoleta y se leyó desde un búfer de memoria aleatorio.
Después de revisar algunas guías: publicación de contenido estático a través de POST desde Nginx y Nginx: solución a "405 no permitido" cuando se utiliza POST que sirve estática al intentar configurar nginx para servir un archivo JSON
simple.
En mi caso, tuve que usar:
max_ranges 0;
para que el navegador no tenga ninguna idea graciosa cuando nginx agrega Accept-Ranges: bytes
en el encabezado de respuesta) , así como
sendfile off;
en mi bloque de server
para el proxy que sirve los archivos estáticos. Agregarlo al bloque de location
que finalmente serviría el archivo JSON
encontrado no ayudó.
Otro prototipo para servir JSON
estáticos tampoco debería olvidar el tipo de respuesta:
charset_types application/json;
default_type application/json;
charset utf-8;
Otras búsquedas arrojaron problemas de permisos de carpeta - nginx está cortando el final de las páginas dinámicas y lo almacena en caché o problemas de almacenamiento intermedio de proxy - Obteniendo una solicitud fragmentada a través de nginx , pero ese no era mi caso.