我已经把我的应用程序使用Cherrypy 3.1.2作为反向代理配置在Nginx后面。 所有对GET请求都有效,但所有POST请求都返回HTTP 400 - 格式错误的标头。CherryPy背后的Nginx反向代理POST请求已损坏/截断
我追查到CherryPy的WSGI-Server源代码,查看请求处理代码,结果发现,如果GET请求的第一个请求线正确地读起来就像例如:
GET /home HTTP/1.0
POST请求它像:
<HTTP headers truncated at front>
POST /home HTTP/1.0
因此,而不是含GET/POST请求行随后的HTTP标头,用于POST的正确形成请求请求我的应用程序从Nginx的接收:
- 首先HTTP标题行,从开始截断通过一些字节数
- 的随后一个空行指示端OD HTTP头
- THEN一个“POST /家庭HTTP/1.0”,这是清楚地预期为第一线的请求。
- 编辑:这是请求的结束,所以也没有身体数据应该跟随HTTP POST标题。
此外,从p.1截断的字节数似乎取决于表单上有多少POST数据,例如我在/ home FORM字段中输入的字符越多, HTTP标头被删除。
显然,Nginx在将头部传递给上游服务器(我的应用程序)时会以某种方式破坏头文件。
但是:当我只是为了测试使Nginx重定向到一些外部网站(使用POST请求) - 一切都很顺利。
所以我现在很困难。
我的配置是:Windows XP中教授,Python的/ 2.5.1,CherryPy的/ 3.1.2,Nginx的/ 0.8.32
浏览器:火狐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)。
即使有单个请求,它是否会发生?如果读取请求主体的错误字节数,则可能发生多个请求的保留问题,如果沿着该行的某些内容在Windows上使用文本模式IO而不是二进制文件(将CRLF序列更改为LF,抛出'Content-Length'字节数)。 – bobince 2010-02-16 16:08:49
是的,即使这是重新启动应用程序并重新加载Nginx后的第一个请求,也会发生。 – 2010-02-16 16:37:16