web-dev-qa-db-ja.com

nginx proxy_cache:並列リクエストをバックエンドに制限します

バックエンドのリバースプロキシとしてnginxを使用しています。構成は非常に基本的です。コアはただです:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

location / {
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

現在、私のサービスは計算上非常に重いので、nginxを使用して、アクティブな並列(同時)リクエストの数を単一のアップストリームバックエンドに制限します。 10.10。

limit_req モジュールを調べましたが、このモジュールは1分あたりの着信リクエストにのみ焦点を当てているようです。特にactiveバックエンド接続の数を制限したいと思います。つまり、リクエストがすでに返されているかどうかを考慮に入れます。これは可能ですか?

ワニスでは、これは例えばを使用して行うことができます。

backend cpu1 {
  .Host = "127.0.0.1";
  .port = "80";
  .max_connections = 20;
}

ただし、これにはnginxを使用する必要があります。

5
Jeroen

limit_conn モジュールを見てください。私が見つけたすべての例はリモートIPによる制限に関するものでしたが、リモートIPではなくlimit_conn_zoneに定数を渡すと、サーバーへの合計接続数によって制限されます。

このようなもの:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

set $const 1;
limit_conn_zone $const zone=one:1m;

location / {
    limit_conn one 10;
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

編集:このモジュールはnginxのより新しいバージョン(おそらく> = v1.1.8)でのみ利用できるようです。このオプションを使用し、古いバージョンのnginxを使用する場合は、ソースからコンパイルする必要がある場合があります。

編集2:nginxがプロキシの役割のみを行っている場合は、 worker_connections を見てください。

7
dwurf

必要な構成オプションは次のとおりです。

proxy_cache_use_stale updating;
proxy_cache_lock on;

これは、キャッシュから古い要素を提供し、バックエンドから更新を発行します。したがって、バックエンドが2秒後にページをサーバーするとき、クライアントはすでにキャッシュから古いリソースを取得しています。

2つ目は、1つの要素をキャッシュからロックしますが、すでにバックエンドへのupdate-cacheリクエストが実行されているため、1つのcache-itemに対する並列リクエストはありません。

これは、ハードプロキシの制限よりもはるかに優れているはずです。

それでも接続のハードプロキシ制限が必要な場合は、バックエンドでnginxを実行し、そこで接続または要求をレート制限できます。それ以外の場合は、iptablesで接続制限を試してみてください。これは、nginxよりもはるかに優れたパフォーマンスを発揮するはずです。

2
RubenKelevra