2013-03-17 7 views
10

Ich habe eine Django-Anwendung in Gunicorn hinter Nginx ausgeführt. Alles funktioniert gut, für eine seltsame Sache: Ich habe eine "Download" -Ansicht und eine RESTful JSON API. Beim Aufruf der Download-Ansicht verwende ich urllib2, um auf die json-API zuzugreifen, um Informationen zu erhalten. Und genau, wenn ich versuche, http http erhalten Anfrage an die JSON API, die Zeitüberschreitung der Anfrage mit einem Fehler HTTP-Fehler 504: Gateway-Timeout.Gunicorn Arbeiter Timeout

Wenn ich den Code mit ./manage.py Runserver laufen alles funktioniert gut. Die HTTP-Get-Anfrage an die JSON-API dauert ebenfalls nur wenige Millisekunden, so dass keine Gefahr eines Timeouts besteht.

Hier ist die Situation in Pseudo-Code:

myproject/views.py: (zugänglich: http://myproject.com/download)

1 def download(request, *args, **kwargs): 
2  import urllib2 
3  opener = urllib2.build_opener() 
4  opener.open('http://myproject.com/api/get_project_stats') 

Der opener.open() Aufruf in Zeile vier Läufen in einen Timeout, wenn in Gunicorn läuft , wenn mit ./manage.py runserver läuft everytihng funktioniert gut (und der API-Aufruf dauert nur ein paar Millisekunden.

Hat jemand das gleiche Problem? Und mehr wichtig: Wie hast du es gelöst?

+0

Haben Sie versucht, mit den [Gunicorn Timeout-Einstellungen] zu spielen (http: // docs.gunicorn.org/en/latest/configure.html#timeout) –

Antwort

13

hatte ich das gleiche Problem mit Gunicorn, nginx, Django und Requests

jedes Mal, wenn ich tat:

response = requests.get('http://my.url.com/here') 

die Arbeiter Timeout würde

ich das Problem durch den Wechsel von syncronous gelöst ((synchrone) Arbeiter mit asynchronen (eventlet) Arbeitern synchronisieren.

wenn Sie Kommandozeile starten:

-k 'eventlet' 

, wenn Sie eine Konfigurationsdatei add verwenden:

worker_class = "eventlet" 
+0

Danke für die Antwort! Das ist es! (Aber ich habe das nicht mit asynchronen Eventlet-Arbeitern gelöst. Ich löste es mit der HTTP-Anfrage in einer asynchronen Aufgabe mit Sellerie.) – Anton

+0

Das funktionierte für mich, als ich ein ähnliches Problem hatte. –

+1

Sie müssen auch Eventlet installieren. Ich habe 'pip install eventlet' verwendet und dann' --worker-class eventlet' zur Kommandozeile hinzugefügt. – Gesias