nginxチャンク転送エンコーディングの有効化


17

nginx 0.8.35はチャンク転送エンコーディングをサポートするようです:

nginx 0.8.35での変更2010年4月1日

*) Change: now the charset filter runs before the SSI filter.

*) Feature: the "chunked_transfer_encoding" directive.

これは素晴らしいです。なぜなら、nginxリバースプロキシを介してgit-http-backendプロセスにgitの変更をプッシュしようとしているからです。Git HTTPは、クライアント側の効率性の理由でチャンク転送エンコードを利用します

しかし、私はそれを動作させることができません。次のconfigure呼び出しでDebian Lennyでnginx 0.8.44を使用しています。

./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--user=www-data \
--group=www-data \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module

そして、次のconfファイル:

server {
    server_name example.com;
    location / {
        proxy_pass  http://192.168.0.10;
        include     /etc/nginx/proxy.conf;
        chunked_transfer_encoding on;
    }
}

そして、私のproxy.confように見えます:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100M;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

(もともと私はこの質問をStack Overflowに投稿しました、Server Faultの方が適切であるとアドバイスされました)


1
バッファとチャンクエンコーディングを使用することはできません。バッファはデータの送信を待機し、チャンク化されたデータはすぐに送信されます。
マーティンフィヨルドヴァルド

どうやらNginxはバージョン1.3.9(27/11/2012)以降のChunkedをサポートしているようです。ただし、スマートフォンがNginxサーバーにチャンクPOST要求を送信すると、「411 Length Required」エラーメッセージが表示されます。何かアドバイス?
メアー

回答:


25

これは古い質問ですが、私は知っていますが、問題の検索で出てきました(これを午後に解決しようとして過ごしました)。Martin Fのコメントは、それを機能させるのに十分な手がかりを与えてくれました!

秘Theはproxy_buffering off;、ロケーションブロックに設定することです。アップストリームサーバーがチャンク化された応答を送り返していると仮定すると、nginxは個々のチャンクをクライアントに送り返します。gzip出力圧縮をオンにしている場合は、オンザフライでそれらをgzip圧縮します。

バッファリングをオフにすることには他の欠点があるため、理由を理解せずに盲目的にバッファリングをオフにしないでください。


9

質問を編集して明確にすることをお勧めします。チャンク化されたリクエストとチャンク化されたレスポンスには大きな違いがあります。ジョン・ダルトンの答えは後者に対応しています。Gitは両方を行います。

Nginxは現在、チャンクされたPOSTリクエストをサポートしていません。この投稿は、トピックに関する検索結果で高く表示されます。チャンクPOST要求は、事前にアップロードされるデータの量がわからない場合に使用され、携帯電話で頻繁に使用されます。

私が見つけた唯一の実用的なソリューションはこれです:

http://wiki.nginx.org/HttpChunkinModule

残念ながら、nginxはロード可能なモジュールをサポートしていないため、nginxを再コンパイルする必要があります。


私は同意します:HttpChunkinModuleが唯一の理論的な回避策であることに気づきました...しかし、それは私の状況では私には開かれていません。他に何かできるかどうか誰にもわかりますか (2011年1月30日以降の変更はありますか?)
mdahlman

1
私が知っている変更はありません。これを有効にするために、先日nginxの再コンパイルを行いました。
ロジャービンズ

2

私の場合...私は多くのことを試してみて、最終的に設定に追加するだけです

proxy_http_version 1.1;

そしてそれは動作します...


追加する必要がありましたproxy_set_header Connection "";...元の回答-> forum.nginx.org/read.php?2,247883,247883#msg-247883
クリスチャン

これも私にとってはうまくいきました。しかし、私は本当に理由を理解していません。
ジェフ

最後のコメントを更新します。...これは、アップストリームサーバーがHTTP 1.1(en.wikipedia.org/wiki/Chunked_transfer_encoding)で導入されたChunked Transfer Encodingを使用していたため機能しました。nginxプロキシのデフォルトのhttpプロトコルバージョンは1.0です。
ジェフ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.