CherryPy hinter Nginx-Reverse-Proxy-POST-Anfragen beschädigt / abgeschnitten

8

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:

  1. Erste HTTP-Headerzeilen, die vom Start um einige Bytes gekürzt wurden
  2. Dann eine leere Zeile, die das Ende der HTTP-Header anzeigt
  3. Dann ein "POST / home HTTP / 1.0", das wurde eindeutig als erste Zeile der Anfrage erwartet.
  4. BEARBEITEN: Das ist das Ende der Anfrage, also gibt es auch KEINE Bodydaten, die den HTTP POST-Headern folgen sollten.

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.

    
Adam Kania 16.02.2010, 12:48
quelle

1 Antwort

1

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.

    
zeroasterisk 10.06.2010 19:48
quelle