2010-02-16 32 views
8

我已经把我的应用程序使用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的接收:

  1. 首先HTTP标题行,从开始截断通过一些字节数
  2. 的随后一个空行指示端OD HTTP头
  3. THEN一个“POST /家庭HTTP/1.0”,这是清楚地预期为第一线的请求。
  4. 编辑:这是请求的结束,所以也没有身体数据应该跟随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)。

+0

即使有单个请求,它是否会发生?如果读取请求主体的错误字节数,则可能发生多个请求的保留问题,如果沿着该行的某些内容在Windows上使用文本模式IO而不是二进制文件(将CRLF序列更改为LF,抛出'Content-Length'字节数)。 – bobince 2010-02-16 16:08:49

+0

是的,即使这是重新启动应用程序并重新加载Nginx后的第一个请求,也会发生。 – 2010-02-16 16:37:16

回答

1

你可以尝试的参数:

ignore_invalid_headers on; 
sendfile     on; 
在HTTP块

...也可以尝试禁用保持连接,并确保您登录访问/错误调试。