2012-04-21 19 views
38

Estoy ejecutando una aplicación django en twisted usando los scripts django-on-twisted desde this site.El servidor retorcido se cuelga inesperadamente al ejecutar django

Todas las solicitudes son atendidas por un servidor nginx que reenvía las solicitudes relevantes a twisted. Tengo una configuración de URL para una API, que básicamente solo recibe solicitudes de obtención y realiza algún procesamiento en los parámetros de obtención antes de enviar una respuesta. Sin embargo, cuando un cliente específico está presionando la API, el servidor retorcido simplemente se apaga. Pegado a continuación es el registro de Nginx:

the.ip.of.client - - [21/Apr/2012:11:30:36 -0400] "GET /api/url/?get=params&more=params HTTP/1.1" 499 0 "-" "Java/1.6.0_24" 

Los troncos retorcidos muestran nada más que paradas retorcidos que trabajan en este punto. Con el código de error 499, supongo que el cliente cerró la conexión de forma inesperada, lo cual no tengo ningún problema. Si el cliente recibe la respuesta o no, no es importante para mí. Aquí está la vista de Django relevante:

def api_url(request): 
    if request.GET: 
     get_param = request.GET.get('get', [''])[0] 
     more_param = request.GET.get('more', [''])[0] 
     #some processing here based on the get params 
     return HttpResponse('OK') 
    else: 
     raise Http404 

La solicitud del cliente es una solicitud válida y no afecta al procesamiento de una manera adversa. Lo he probado desde el caparazón. Cuando lo probé en el servidor de desarrollo django, se bloqueó de la misma manera sin dejar ningún rastro de recibir la solicitud. Todo funciona perfectamente bien cuando se prueba desde el navegador. Además, el servidor retorcido funciona bien para todos los casos de uso regular. Esta es la primera vez que me enfrento a un problema. Cualquier ayuda o punteros serán apreciados.

+1

¿Qué significa "apaga" decir? ¿Sale limpiamente? ¿Una señal hace que salga? –

+0

El servidor retorcido no escribe nada en los registros. Estoy bastante seguro de que no es una salida limpia. Simplemente deja de funcionar. ¿Alguna idea de cómo podría atrapar la señal de salida? – tapan

+6

Si está utilizando bash, entonces '$?' Ayudará. Desde la página del hombre bash: **? Se expande al estado de salida de la tubería de primer plano ejecutada más recientemente. ** Entonces, por ejemplo, 'twistd ...; echo $? ' –

Respuesta

1

No hay código http 499 en rfc. Nginx define el código 499 en sí mismo.

Cuando un cliente envió una solicitud y cerró la conexión sin esperar la respuesta, se produce un código 499. Si hay un montón de 499 en su access_log, en su mayoría es causado por los lentos back-ends (demasiado lento para que los usuarios esperen). Es posible que deba optimizar el rendimiento de su sitio web.

http://forum.nginx.org/read.php?2,213789,213794#msg-213794

+0

El back-end está bien en realidad. El 499 es causado por un bot que está volcando datos en el back-end a través de get variables. Envía la solicitud y cierra inmediatamente la conexión sin esperar la respuesta. Este es un comportamiento aceptable. Simplemente no quiero que se tuerza debido a eso. Estoy usando gunicornio ahora y funciona perfectamente para el mismo caso de uso. – tapan

1
  • que dicen que el problema es de un cliente golpear una URL concreta (reproducible?)
  • ya que funciona para usted con gunicorn pero no django-en-trenzado, o bien el guión no es funciona correctamente o twisted.web2 es el problema.

intente con $ sh init.sh yourdjangoproject stand.

también se puede tratar de modificar run.py para atrapar SystemExit:

import pdb 
try: 
    # __main__ stuff here. 
except (KeyboardInterrupt, SystemExit): 
    pdb.set_trace() 
+0

¡Gracias por la respuesta! Realmente no estoy en condiciones de probar esto ya que nos hemos mudado a una arquitectura completamente nueva. Pero intentaré configurar un entorno para este caso específico en algún momento más tarde y veré si tu respuesta ayuda. – tapan

Cuestiones relacionadas