CherryPy在Nginx反向代理后POST请求被损坏/截断

8 投票
1 回答
4595 浏览
提问于 2025-04-15 19:20

我把我的应用程序用 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

所以,对于 POST 请求,我的应用程序从 Nginx 收到的请求不是正确的格式,它应该是包含 GET/POST 请求行和 HTTP 头部的,但实际收到的是:

  1. 第一行 HTTP 头部被截断了一些字节
  2. 然后是一个空行,表示 HTTP 头部的结束
  3. 接着是“POST /home HTTP/1.0”,这本来应该是请求的第一行。
  4. 补充:这就是请求的结束,所以后面也没有应该跟在 HTTP POST 头部后的数据。

另外,第一点中被截断的字节数似乎与表单中 POST 数据的多少有关,比如我在 /home 表单字段中输入的字符越多,HTTP 头部被截断的字符也越多。

显然,Nginx 在把请求传递给上游服务器(我的应用程序)时,某种程度上损坏了头部。
但是:当我测试时让 Nginx 重定向到一些外部网站(同样使用 POST 请求)时,一切都正常。

所以我现在有点无从下手。

我的配置是:Windows XP 专业版,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 加上一个小的常数(可能是 2)。

1 个回答

1

你可以试试这些参数:

ignore_invalid_headers   on;
sendfile                 on;

在http部分... 还可以尝试关闭保持连接的功能,并确保你在记录访问和错误信息,以便进行调试。

撰写回答