我有一个通过Nginx和uWsgi托pipe的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的accesslog:
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"
实质上,如果我使用POST,Nginx会丢失响应,而不是使用GET。
有人知道吗?
通过--post-buffering 1
到uwsgi
这会自动缓冲所有的http身体> 1字节
nginx管理上游断开连接的方式引发了这个问题
我碰到同样的问题,但在我的情况下,我不能禁用“uwsgi_pass_request_body”多数时间(但不是总是)我的应用程序确实需要POST数据。
这是我找到的解决方法,而这个问题是不是固定在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()
我面临同样的问题。 我尝试了以上的所有解决方案,但他们没有工作。 忽略我的情况下的响应正文不是一个选项。
显然, 在处理响应小于4052字节的POST请求时,这是nginx和uwsgi的错误
对我来说,解决的办法是在uwsgi的参数列表中加入“–pep3333-input”。 之后,所有POST都正确返回。
我正在使用的nginx / uwsgi的版本:
$ nginx -V nginx: nginx version: nginx/0.9.6 $ uwsgi --version uWSGI 0.9.7
幸运的发现后,进一步的研究(http://answerpot.com/showthread.php?577619-Several%20Bugs/Page2)我发现了一些帮助…
提供uwsgi_pass_request_body off;
Nginx的配置参数解决了这个问题…