23

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"

本質的に、POSTを使用すると、どこかでNginxが応答を失いますが、GETを使用した場合はそうではありません。

誰かがそれについて何か知っていますか?

4

4 に答える 4

28

uwsgi--post-buffering 1に渡す

これにより、1バイトを超えるすべてのhttpボディが自動的にバッファリングされます

この問題は、nginxがアップストリームの切断を管理する方法によって発生します

于 2011-02-25T06:58:46.157 に答える
5

同じ問題が発生しましたが、ほとんどの場合(常にではありませんが)アプリがPOSTデータを必要とするため、「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()
于 2011-02-18T15:58:32.417 に答える
5

私は同じ問題に直面しています。上記のすべての解決策を試しましたが、機能しませんでした。私の場合、応答本文を無視することは単に選択肢ではありません。

どうやら、応答が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
于 2011-06-12T06:05:44.477 に答える
1

さらなる調査で幸運な発見をした後(http://answerpot.com/showthread.php?577619-Several%20Bugs/Page2)私は助けになる何かを見つけました...

uwsgi_pass_request_body off;Nginx confにパラメーターを指定すると、この問題が解決します...

于 2010-10-19T16:36:25.143 に答える