代码之家  ›  专栏  ›  技术社区  ›  Ulf

nginx连接重置,来自uwsgi的响应丢失

  •  21
  • Ulf  · 技术社区  · 14 年前

    我有一个通过nginx和uwsgi托管的django应用程序。在一个非常简单的请求中,对于get和post,我得到了不同的行为,但事实并非如此。

    uwsgi守护进程日志:

    [pid: 32454|app: 0|req: 5/17] 127.0.0.1 () {36 vars in 636 bytes} [Tue Oct 19 11:18:36 2010] POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ => generated 80 bytes in 3 msecs (HTTP/1.0 440) 1 headers in 76 bytes (0 async switches on async core 0)
    [pid: 32455|app: 0|req: 5/18] 127.0.0.1 () {32 vars in 521 bytes} [Tue Oct 19 11:18:50 2010] GET /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ => generated 80 bytes in 3 msecs (HTTP/1.0 440) 1 headers in 76 bytes (0 async switches on async core 0)
    

    nginx访问日志:

    127.0.0.1 - - [19/Oct/2010:18:18:36 +0200] "POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0" 440 0 "-" "curl/7.19.5 (i486-pc-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15"
    127.0.0.1 - - [19/Oct/2010:18:18:50 +0200] "GET /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0" 440 80 "-" "curl/7.19.5 (i486-pc-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15"
    

    nginx错误日志:

    2010/10/19 18:18:36 [error] 4615#0: *5 readv() failed (104: Connection reset by peer) while reading upstream, client: 127.0.0.1, server: localhost, request: "POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0", upstream: "uwsgi://unix:sock/uwsgi.sock:", host: "localhost:9201"
    

    本质上,nginx某处如果我使用post就会失去响应,如果我使用get则不会。

    有人知道吗?

    4 回复  |  直到 12 年前
        1
  •  25
  •   Joe Shaw OscarRyz    12 年前

    通过 --post-buffering 1 对UWSGI

    这将自动缓冲所有HTTP主体1字节

    问题是由nginx管理上游断开的方式引起的。

        2
  •  5
  •   ehabkost    13 年前

    我也遇到了同样的问题,但在我的情况下,我不能禁用“Uwsgi-Pass-Request-Body”,因为大多数时候(但并非总是)我的应用程序都需要发布数据。

    这是我发现的解决方法,而UWSGI中没有解决此问题: http://permalink.gmane.org/gmane.comp.python.wsgi.uwsgi.general/813

    import django.core.handlers.wsgi
    class ForcePostHandler(django.core.handlers.wsgi.WSGIHandler):
        """Workaround for: http://lists.unbit.it/pipermail/uwsgi/2011-February/001395.html
        """
        def get_response(self, request):
            request.POST # force reading of POST data
            return super(ForcePostHandler, self).get_response(request)
    
    application = ForcePostHandler()
    
        3
  •  5
  •   lullis    13 年前

    我也面临同样的问题。我尝试了以上所有的解决方案,但它们都不起作用。在我的例子中,忽略响应主体是不可能的。

    显然是一只虫子 nginx and uwsgi when dealing with POST requests whose response is smaller than 4052 bytes

    解决这个问题的方法是在uwsgi的参数列表中添加“-pep3333 input”。之后,所有的帖子都会正确返回。

    我使用的nginx/uwsgi版本:

    $ nginx -V
    nginx: nginx version: nginx/0.9.6
    
    $ uwsgi --version
    uWSGI 0.9.7
    
        4
  •  1
  •   Ulf    14 年前

    在进一步研究中幸运地发现(http://answerpot.com/showthread.php?577619几个错误/页面2)我发现了一些帮助…

    供应 uwsgi_pass_request_body off; nginx conf中的参数解决了这个问题…