最初にいくつかの背景:小さなイベントをたくさんWebサーバーにアップロードする組み込みデバイスがあります。この情報の投稿には、チャンクエンコーディングが使用されます。すべてのイベントは個別のチャンクとして送信されるため、Webサーバー(node.js)はイベントにすぐに反応できます。これはすべて魅力のように機能しています。
サーバーを無効にし、サーバー上でnetcatを実行すると、デバイスが送信するものが表示されます。
Sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: url.com
User-Agent: spot/33-dirty
Transfer-Encoding: chunked
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache
120
{"some","json message"}
232
{"other","json event"}
232
{"and a lot more","up to 150 messages per second!"}
0
次に、nginxをWebサーバー(バージョン1.6.0)にインストールしました。最終的には、SSLを処理し、通常のWebトラフィックの高速化を処理したいと考えています。
このサーバー構成でnginxを有効にした場合:
server {
listen 8080;
location / {
proxy_http_version 1.1;
expires off;
proxy_buffering off;
chunked_transfer_encoding on;
proxy_pass http://localhost:5000;
}
}
それから私はこれを受け取ります:
Sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: localhost:5000
Connection: close
Content-Length: 2415
User-Agent: spot/33-dirty
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache
{"some","json message"}
{"other","json event"}
{"and a lot more","up to 150 messages per second!"}
問題はこれがバッファリングされ、リクエストが2秒ごとに送信されることです。すべてのメッセージが含まれ、処理できます。しかし、今は遅れがあります...
チャンクを直接転送するようにnginxに指示できますか?これは、この埋め込みエンドポイントでのみ発生する必要があります。すべてのエンドポイントに対してこれを無効にする場合、nginxではあまり使用されないことを理解しています。
Nginx 1.8.xまたはNginx 1.9.xにアップグレードできる場合は、このディレクティブを使用してリクエストのバッファリングを無効にできます。
proxy_request_buffering off
これで問題が解決すると思います。
proxy_buffering off
を使用すると、nginxはバックエンドからのチャンク化された応答をバッファリングしません。 chunked_transfer_encoding on
を明示的に設定する必要はありません。これがデフォルトです。診断に向けた次のステップは、nginxとバックエンドの間のストリームを監視することです(tcpdump -i lo -n port 5000
の簡単なビットでうまくいくはずです)。nginxが実際にバッファリングされているか、または何らかの理由でバックエンドが変更されました。
私にとっての救済策は、次の2つの設定でした。
ファイル内:/etc/nginx/nginx.conf
追加:
proxy_max_temp_file_size 0;
proxy_buffering off;
行間client_max_body_size 128M;
およびserver_names_hash_bucket_size 256;
:
http {
client_max_body_size 128M;
proxy_max_temp_file_size 0;
proxy_buffering off;
server_names_hash_bucket_size 256;