CherryPy背后的Nginx反向代理POST请求被破坏/截断

时间:2010-02-16 12:48:37

标签: python nginx cherrypy reverse-proxy

我已将使用Cherrypy 3.1.2的应用程序置于Nginx后面,配置为反向代理。 All都适用于GET请求,但所有POST请求都返回HTTP 400 - 格式错误的标题。

我追溯到CherryPy WSGI-Server源代码以查看请求处理代码,并发现如果对于GET请求,第一个请求行正确读取,例如:

GET /home HTTP/1.0

对于POST请求,它就像:

<HTTP headers truncated at front>

POST /home HTTP/1.0

因此,对于包含GET / POST请求行后跟HTTP标头的正确形成的请求,我的应用程序从Nginx收到POST请求,而不是

  1. 第一个HTTP标题行从开头截断一些字节数
  2. 然后是一个空白行,表示结束od HTTP标题
  3. 然后是“POST / home HTTP / 1.0”,这显然是请求的第一行。
  4. 编辑:这是请求的结束,因此也没有应该遵循HTTP POST标头的正文数据。
  5. 此外,从p.1截断的字节数似乎取决于表单上有多少POST数据,例如我在/ home FORM字段中键入的字符越多,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 +一些小的const数(可能是2)。

1 个答案:

答案 0 :(得分:1)

您可以尝试参数:

ignore_invalid_headers   on;
sendfile                 on;
http块中的

...也可能会尝试禁用Keepalive并确保您正在记录访问/错误以进行调试。