Ich habe meine Anwendung mit Cherrypy 3.1.2 hinter Nginx als Reverse-Proxy konfiguriert. Alles funktioniert richtig für GET-Anfragen, aber alle POST-Anfragen geben HTTP 400 - Fehlerhafte Kopfzeile zurück.
Ich habe in CherryPy WSGI-Server-Quellcode nachverfolgt, um den Code zur Bearbeitung von Anforderungen zu sehen, und herausgefunden, dass bei GET-Anforderungen die erste Anforderungszeile korrekt gelesen wird, wie zum Beispiel:
%Vor%für POST-Anfragen ist es wie folgt:
%Vor%Anstelle der korrekt gebildeten Anfrage, die eine GET / POST-Anforderungszeile gefolgt von HTTP-Headern enthält, empfängt meine Anwendung von POST-Anfragen von Nginx:
Darüber hinaus scheint die Anzahl der Bytes der Kürzung von p.1 davon abhängig zu sein, wie viele POST-Daten in einem Formular vorhanden sind, zum Beispiel je mehr Zeichen ich in / home FORM-Felder eintippe, desto mehr Zeichen in den HTTP-Headern werden entfernt.
Scheinbar beschädigt Nginx den Header irgendwie, wenn er an den Upstream-Server (meine Anwendung) übergeben wird.
ABER: als ich gerade für den Test Nginx umgeleitet habe auf einige externe Webseiten (auch mit POST-Anfragen) geht alles gut.
Also bin ich jetzt ziemlich festgefahren.
Meine Konfiguration ist: Windows XP Prof, Python / 2.5.1, CherryPy / 3.1.2, Nginx / 0.8.32
Browser: FireFox 2.0, IE 7.0
Meine Anwendung (im Standalone-Modus) funktioniert im Allgemeinen und wurde in einer Reihe von Konfigurationen getestet.
Ich verwende eine ziemlich einfache Nginx-Konfiguration wie:
%Vor%Obwohl viele andere Beispiele und Konfigurationen von proxy_pass im Internet gefunden wurden.
Irgendwelche Ideen, wo Sie nach dem Problem suchen? Nginx Konfiguration, meine CherryPy App oder anderswo?
NEU: Ich habe festgestellt, dass es korrekt funktioniert, aber nur für POST-Anfragen, die keine Body-Länge haben (leer gemacht ohne irgendwelche Felder, um das zu testen).
Und verifiziert, dass die Anzahl der vom Begin abgeschnittenen Bytes gleich der Inhaltslänge + irgendeiner kleinen Konstantenzahl (wahrscheinlich 2) ist.
Sie könnten die Parameter ausprobieren:
%Vor%im HTTP-Block ... könnte auch versuchen, Keepalives zu deaktivieren und sicherzustellen, dass Sie Zugriff / Fehler beim Debuggen protokollieren.
Tags und Links python nginx reverse-proxy cherrypy