web-dev-qa-db-ja.com

Nginx:リクエスト本文のバッファリングを完全に無効にする方法

私はUbuntuボックスに Madsonic をセットアップし、その前でNginxを実行しようとしています。問題は、Webインターフェースを介してデータをアップロードしようとすると、この警告が表示され続けることです。

31115#0: *14 a client request body is buffered to a temporary file

これは、アップロードウィンドウの進行状況バーが機能しない理由も説明します。これが私の関連するNginx設定です:

    # proxy the madsonic server here
    location / {
            proxy_pass                      https://madsonic-server/;
            proxy_redirect                  off;
            proxy_buffering                 off;
            proxy_request_buffering         off;
            allow                           all;
            proxy_http_version              1.1;

            proxy_set_header                Host $http_Host;
            proxy_set_header                X-Real-IP $remote_addr;
            proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header                X-Forwarded-Host $server_name;
            proxy_set_header                X-Forwarded-Proto $scheme;

            client_body_buffer_size         0;
            client_max_body_size            0;
            proxy_max_temp_file_size        0;
            proxy_read_timeout              18000;
            proxy_send_timeout              18000;

            gzip                            off;
    }

現在Nginx 1.9.12を使用しています。

私が達成したいのは、Nginxがリクエストボディバッファをまったく使用しないようにし、サイズに関係なく、リクエストボディを直接Madsonicに渡すことです。これは可能ですか?もしそうなら、正しい構成は何でしょうか?

他の質問は、バッファサイズを設定する方法で答えられるようです。バッファは必要ありません。リクエストボディをマドソニックに直接渡したい。

17
rad

DockerレジストリにNginxプロキシを設定するのと同じ問題がありました。私は結局しました:

client_max_body_size 0;
proxy_http_version 1.1;
proxy_request_buffering off;

client_max_body_sizeエラーを防ぐために0にする必要がありましたが、watch -n 1 du -hs .は明らかに違いを示しました。バッファリングにより、要求後にデータが表示され、要求中にバッファリングされることはありませんでした。

proxy_http_version 1.1はチャンクエンコーディングのために必要です。 Nginxドキュメントからの引用:

HTTP/1.1チャンク転送エンコーディングを使用して元のリクエスト本文を送信する場合、HTTP/1.1でプロキシが有効になっていない限り、ディレクティブ値に関係なくリクエスト本文はバッファリングされます。

19
Halfgaar