簡體   English   中英

Nginx反向代理POST請求后的CherryPy損壞/截斷

[英]CherryPy behind Nginx reverse-proxy POST requests corrupted/truncated

我已經將使用Cherrypy 3.1.2的應用程序放在配置為反向代理的Nginx之后。 一切都對GET請求有效,但是所有POST請求都返回HTTP 400-格式錯誤的標頭。

我跟蹤到CherryPy WSGI-Server源代碼以查看請求處理代碼,發現對於GET請求,如果第一個請求行正確讀取,例如:

GET /home HTTP/1.0

對於POST請求,就像:

<HTTP headers truncated at front>

POST /home HTTP/1.0

因此,不是我的應用程序從Nginx接收到的POST請求,而不是包含GET / POST請求行和HTTP標頭的格式正確的請求:

  1. 第一個HTTP標頭行從開始處被截斷了一定數量的字節
  2. 然后,空行指示結束od HTTP標頭
  3. 然后創建一個“ POST / home HTTP / 1.0”,這顯然是請求的第一行。
  4. 編輯:那是請求的結尾,所以也沒有正文數據應遵循HTTP POST標頭。

此外,從p.1開始的截斷字節數似乎取決於表單上的POST數據量,例如,我在/ home FORM字段中鍵入的字符越多,HTTP標頭中刪除的字符就越多。

顯然,Nginx將標頭傳遞給上游服務器(我的應用程序)時,它以某種方式破壞了標頭。
但是:當我只是為了進行測試時,使Nginx重定向到某些外部網站(也使用POST請求)-一切正常。

所以我現在很困。

我的配置是:Windows XP Prof,Python / 2.5.1,CherryPy / 3.1.2,Nginx / 0.8.32
瀏覽器:FireFox 2.0,IE 7.0
我的應用程序(獨立運行)通常可以在多種配置下運行和測試。

我使用非常基本的Nginx配置,例如:

upstream backend {
    server localhost:8088 weight=1;
}
server {
    listen 80;
    server_name  localhost;

    location / {
        #proxy_read_timeout 300;

        proxy_pass http://backend;
        #proxy_redirect default;
    }
}

盡管嘗試過許多在網上找到的proxy_pass的其他示例和配置。

有什么想法可以找到問題嗎? Nginx配置,我的CherryPy應用程序還是其他地方?

新:我發現,它可以正常運行,但僅適用於正文內容長度為零的POST請求(將其為空,沒有任何字段可對其進行測試)。
並驗證了從開始處被截斷的字節數等於Content-length +一些小的const數字(可能為2)。

您可以嘗試參數:

ignore_invalid_headers   on;
sendfile                 on;

在http塊中...也可以嘗試禁用keepalive並確保您記錄訪問/錯誤以進行調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM