CherryPy在Nginx反向代理后POST请求被损坏/截断
我把我的应用程序用 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 头部的,但实际收到的是:
- 第一行 HTTP 头部被截断了一些字节
- 然后是一个空行,表示 HTTP 头部的结束
- 接着是“POST /home HTTP/1.0”,这本来应该是请求的第一行。
- 补充:这就是请求的结束,所以后面也没有应该跟在 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 个回答
你可以试试这些参数:
ignore_invalid_headers on;
sendfile on;
在http部分... 还可以尝试关闭保持连接的功能,并确保你在记录访问和错误信息,以便进行调试。