バックエンドのリバースプロキシとして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を使用する必要があります。
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 を見てください。
必要な構成オプションは次のとおりです。
proxy_cache_use_stale updating;
proxy_cache_lock on;
これは、キャッシュから古い要素を提供し、バックエンドから更新を発行します。したがって、バックエンドが2秒後にページをサーバーするとき、クライアントはすでにキャッシュから古いリソースを取得しています。
2つ目は、1つの要素をキャッシュからロックしますが、すでにバックエンドへのupdate-cacheリクエストが実行されているため、1つのcache-itemに対する並列リクエストはありません。
これは、ハードプロキシの制限よりもはるかに優れているはずです。
それでも接続のハードプロキシ制限が必要な場合は、バックエンドでnginxを実行し、そこで接続または要求をレート制限できます。それ以外の場合は、iptablesで接続制限を試してみてください。これは、nginxよりもはるかに優れたパフォーマンスを発揮するはずです。