web-dev-qa-db-ja.com

ゾーンメモリの枯渇につながる可能性のあるものと、Nginxがそれにどのように反応するのですか?

limit_conn_zone ディレクティブで接続ゾーンに指定されたメモリを使い果たすための可能なシナリオは何ですか?この場合の意味は何ですか?

構成にこれがあるとします。

http {
  limit_conn_zone $binary_remote_addr zone=connzone:1m;
  ...
  server {
    limit_conn connzone 5;

ドキュメントによると、64ビットサーバーのconnzoneに16000の状態を割り当てます。それはまたそれを言います

ゾーンのストレージが使い果たされると、サーバーはそれ以降のすべてのリクエストに対してエラー503(Service Temporarily Unavailable)を返します。

まぁ、いいよ。しかし、それは実際にはどういう意味ですか?これはいつ起こりますか?誰がそれらの503を受け取りますか? connzoneに関連付けられたIPの数がどういうわけかが16000に達すると、全員が503を取得し、それがすべて終了することを意味しますか? Nginxはどのように決定しますか?ドキュメントはこれに関して奇妙に曖昧です。

では、設定例を考えると、誰が実際に503を取得し、どのような状況で、そこからどのように処理されるのでしょうか。 リクエストゾーン と同じですか?

2
Miles Hughes

練習?サーバーに接続されているIPの総数を制御できます。

いつ?まあ、ゾーンがいっぱいなら。

誰ですか?はい、まだゾーン内にいないすべての人で、ゾーンがいっぱいである限り。

64ビットシステムを使用していて、ゾーンを1Mに設定している場合、nginxは最大16,000のIPを保存できます。これは、16,001個のIPを保存する必要がある場合、+ 1ユーザーが最初の503エラーを受け取ることを意味します。 B-tree がいっぱいの場合、決定は非常に簡単です。拒否します。

モジュールのソースコードを読むことで、正確な実装を見つけることができます: https://github.com/git-mirror/nginx/blob/master/src/http/modules/ngx_http_limit_conn_module.c

リクエストゾーンは非常によく似ています。

1
Fleshgrinder

http://forum.nginx.org/read.php?2,233709,233722#msg-233​​722 からの引用

サーバーは、最大16kの個別のクライアントIPアドレスの接続数を追跡できます。その数のアクティブなクライアントがある場合、IPがまだ不明なクライアントからの次の接続試行は新しい状態を作成しようとしますが、ゾーンが使い果たされてクライアントが返されるため、失敗します503。

したがって、接続数が16000(または制限が何であれ)未満に減少した場合、将来の接続は503を取得しません。

1
laike9m