2012-04-21 4 views
38

Ich verwende eine Django-Anwendung auf verdreht mit den django-on-twisted Skripte von this site.Twisted Server stürzt unerwartet während der Ausführung von django ab

Alle Anforderungen werden von einem Nginx-Server bedient, der die relevanten Anforderungen an die umgekehrte Proxys verdreht. Ich habe ein URL-Setup für eine API, die im Grunde nur erhalten Anfragen und macht einige Verarbeitung auf die Get-Parameter vor dem Senden einer Antwort. Wenn jedoch ein bestimmter Client die API trifft, wird der verdrehte Server einfach heruntergefahren. Unten ist das Nginx Protokoll:

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" 

Die verdrehten Protokolle zeigen nichts anderes als verdreht stoppt an dieser Stelle funktioniert. Mit dem Fehlercode 499 gehe ich davon aus, dass der Client die Verbindung unerwartet geschlossen hat, womit ich kein Problem habe. Ob der Kunde die Antwort erhält oder nicht, ist mir nicht wichtig. Hier ist die relevante django Ansicht:

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 

Die Anforderung von dem Client eine gültige Anforderung und nicht die Verarbeitung in einer negativen Art und Weise beeinflussen. Ich habe es aus der Schale getestet. Als ich es auf dem django-Entwicklungsserver ausprobierte, stürzte es auf die gleiche Weise ab, ohne irgendwelche Spuren des Empfangs der Anfrage zu hinterlassen. Alles funktioniert perfekt, wenn man es vom Browser aus testet. Außerdem funktioniert der Twisted-Server für alle regulären Anwendungsfälle. Dies ist das erste Mal, dass ich damit ein Problem habe. Jede Hilfe oder Hinweise werden geschätzt.

+1

Was "heruntergefahren" bedeutet das? Verlässt es sauber? Führt ein Signal dazu, dass es austritt? –

+0

Der verdrehte Server schreibt nichts in die Protokolle. Ich bin mir ziemlich sicher, dass es kein sauberer Ausgang ist. Es hört einfach auf zu arbeiten. Irgendeine Idee, wie ich vielleicht das Ausstiegssignal bekommen könnte? – tapan

+6

Wenn Sie bash verwenden, hilft '$?'. Von der Bash-Man-Seite: **? Expandiert in den Exit-Status der zuletzt ausgeführten Vordergrund-Pipeline. ** So zum Beispiel "twistd ...; echo $? ' –

Antwort

1

Es gibt keinen 499 http-Code in RFC. Nginx definiert 499-Code selbst.

Wenn ein Client eine Anforderung gesendet und die Verbindung ohne Warten auf die Antwort geschlossen hat, tritt ein Code 499 auf. Wenn sich in Ihrem access_log viele 499er befinden, wird das meistens durch die langsamen Backends verursacht (zu langsam für Ihre Benutzer, die warten). Möglicherweise müssen Sie die Leistung Ihrer Website optimieren.

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

+0

Das Backend ist in Ordnung. Die 499 wird durch einen Bot verursacht, der Daten über get Variablen in das Backend legt. Er sendet die Anfrage und schließt sofort die Verbindung, ohne auf die Antwort zu warten. Dies ist ein akzeptables Verhalten. Ich will einfach nicht, dass es deswegen abstürzt. Ich benutze jetzt Gunicorn und es funktioniert perfekt für den gleichen Anwendungsfall. – tapan

1
  • Sie sagen, das Problem von einem Client ist eine bestimmte URL schlagen (reproduzierbar?)
  • da es für Sie mit gunicorn funktioniert aber nicht django-on-twisted, entweder das Skript nicht richtig funktioniert oder twisted.web2 ist das Problem.

Bitte versuchen Sie $ sh init.sh yourdjangoproject stand.

Sie auch run.py zu ändern versuchen können SystemExit zu fangen:

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

Danke für die Antwort! Ich bin wirklich nicht in der Lage, das auszuprobieren, seit wir zu einer komplett neuen Architektur gewechselt sind. Aber ich werde versuchen, eine Umgebung für diesen speziellen Fall irgendwann später einzurichten und zu sehen, ob deine Antwort hilft. – tapan