2016-09-14 3 views
10

Ich sende eine Post-Anfrage von einer Methode innerhalb einer Webanwendung, die auf django + nginx + gunicorn läuft. Ich habe keine Probleme, 200 Antworten aus dem gleichen Code zu erhalten, wenn sie auf dem eigenen Server von django ausgeführt werden (mit runserver).Eine POST-Anfrage an eine externe URL von einem django + gunicorn + nginx-Setup senden

try: 
    response = requests.post(post_url, data=some_data) 
    if response.status_code == OK and response.content == '': 
     logger.info("Request successful") 
    else: 
     logger.info("Request failed with response({}): {}".format(response.status_code, response.content)) 
     return response.status_code == OK and response.content == '' 
except requests.RequestException as e: 
    logger.info("Request failed with exception: {}".format(e.message)) 
    return False 

Ich überprüfte die Server-Logs bei post_url, es gibt tatsächlich 200 Antwort mit diesen Daten. Wenn ich die App jedoch hinter Gunicorn und Nginx laufe, kann ich die Antwort nicht empfangen (obwohl die Anfrage gesendet wird). Der Code bleibt in der ersten Zeile nach dem try-Block hängen und der Gunicorn-Worker überschreitet die Zeit (nach 30 Sekunden).

Dies ist das Apache-Server Protokoll am POST_URL:

[14/Sep/2016:13:19:20 +0000] "POST POST_URL_PATH HTTP/1.0" 200 295 "-" "python-requests/2.9.1" 

UPDATE:

ich vergaß zu erwähnen, diese Anfrage dauert weniger als eine Sekunde auszuführen, so ist es kein Timeout Problem. Etwas stimmt nicht mit der Konfiguration? Ich habe die Standard-Nginx + Gunicorn-Setup, wo Gunicorn als Proxy-Pass in Nginx festgelegt ist. Ich rate, da ich hinter einem Nginx-Proxy bin, sollte ich etwas anderes tun, während ich eine Post-Anfrage von der Anwendung sende?

+0

Da Sie einige nützliche Informationen für die Diagnose zur Verfügung stellen, denke ich, dass Sie hier {} Arten von Fehler haben können: - es scheint, dass Sie die HTTP-Anfrage erreichen können, aber nicht das Ergebnis erhalten. Überprüfe zunächst deine Firewall (sei wahrscheinlich der 'iptables -L-Befehl und sieh nach, ob es eine Regel über Port 80 in deiner' INPUT'-Tabelle gibt). - ist Ihre Anfrage eine https-Anfrage an einen nicht vertrauenswürdigen Server? - Haben Sie versucht, einen anderen Server zu erreichen? – artragis

+1

Wie viele Gunnicorn Arbeiter hast du? – VBart

+0

@artragis Ich kann die Anfrage erfolgreich mit der Django-Shell ausführen. Ich kann denselben Code in einem Python-Skript ohne Probleme auf dem gleichen Computer ausführen. – SeeknInspYre

Antwort

4

In meinen Gunicorn-Einstellungen wurde dieses Problem durch Setzen von workers=2 behoben.

Wenn ich eine Anfrage an die externe URL gesendet habe, würde die externe Anwendung eine Anfrage zurücksenden. Diese neue Anforderung würde den einzigen Mitarbeiter in der Anwendung belegen. Die ursprüngliche Anfrage, die ich gesendet habe, ist arbeitslos, und so bleibt es hängen. Mit 2 Mitarbeitern kann ich gleichzeitig eine Anfrage senden und eine weitere Anfrage erhalten.

-1

Dies ist ein Gunicorn Timeout Problem. Sie können das Zeitlimit für Gunicorn erhöhen, indem Sie das zusätzliche Flag --timeout 60 in dem Befehl angeben, den Sie zum Ausführen von Gunicorn verwenden. Natürlich können Sie die Timeout-Länge entsprechend Ihren Anforderungen anpassen. Das Argument ist in Sekunden.

+0

Dies ist kein Timeout-Problem. Ohne Gunicorn dauert die Postanfrage weniger als eine Sekunde. – SeeknInspYre

0

Sie könnten Probleme mit Nginx haben, wo das Problem nginx request entity too large sein könnte. Wenn Sie zu große Daten an den Server senden, lehnt Nginx die Anfrage möglicherweise ab. Wir hatten Probleme mit Nginx, die Probleme verursachten, als wir versuchten, ein zu großes Bild hochzuladen. Wir verwenden auch Nginx + Gunicorn mit Django. Ich vermute also. Dies könnte das gleiche Problem sein.

+0

Nein, ich sende nur ein kleines Python-Objekt mit einigen Daten, nichts zu groß. Wie auch immer, ich kann das debuggen? – SeeknInspYre

+0

Auch die Anfrage wird gesendet, ich bekomme keine Antwort, das ist alles – SeeknInspYre

Verwandte Themen