ホームページ  >  記事  >  運用・保守  >  Nginxの電流制限を設定する方法

Nginxの電流制限を設定する方法

PHPz
PHPz転載
2023-06-02 13:10:061928ブラウズ

空のバケット

最も単純な電流制限設定から始めます: クライアント IP 制限フローの

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
  location /login/ {
    limit_req zone=ip_limit;
    proxy_pass http://login_upstream;
  }
}
  • $binary_remote_addr。

  • zone=ip_limit:10m 電流制限ルールの名前は ip_limit で、10MB のメモリ空間を使用して IP に対応する電流制限ステータスを記録できます。

  • rate=10r/s 現在の制限速度は 1 秒あたり 10 リクエストです

  • location /login/ ログイン フローを制限します


現在の制限速度は 1 秒あたり 10 リクエストです。アイドル状態の nginx に 10 リクエストが同時に到着した場合、すべて実行できますか?

Nginxの電流制限を設定する方法

リーキーバケットのリークリクエストは一律です。どうして10r/sが一定速度なのでしょうか? 100 ミリ秒ごとに 1 つのリクエストがリークされます。

この構成では、バケットは空であり、リアルタイムでリークできないリクエストはすべて拒否されます。

したがって、10 個のリクエストが同時に到着した場合、実行できるリクエストは 1 つだけで、他のリクエストは拒否されます。

これはあまり親切ではありませんが、ほとんどのビジネス シナリオでは、これら 10 個のリクエストが実行できることが望まれます。

#burst

前のセクションの問題を解決するために設定を変更しましょう

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
  location /login/ {
    limit_req zone=ip_limit burst=12;
    proxy_pass http://login_upstream;
  }
}

burst=12 リーキーのサイズバケットは 12


Nginxの電流制限を設定する方法

# 論理的にはリーキー バケットと呼ばれ、実行できないリクエストを一時的にキャッシュする FIFO キューとして実装されます。

リーク速度はリクエストあたり 100 ミリ秒のままですが、同時に到着して一時的に実行できないリクエストを最初にキャッシュできます。キューがいっぱいの場合にのみ、新しいリクエストが拒否されます。

このように、リーキーバケットは電流を制限するだけでなく、ピークを削り、谷を埋める役割も果たします。

このような構成では、10 個のリクエストが同時に到着すると、100 ミリ秒ごとに 1 つずつ順番に実行されます。

実行されましたが、実行のキューイングにより遅延が大幅に増加しましたが、これは多くのシナリオではまだ許容できません。

nolay

遅延が長すぎることによる遅延増加の問題を解決するために、設定の変更を続けます

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
  location /login/ {
    limit_req zone=ip_limit burst=12 nodelay;
    proxy_pass http://login_upstream;
  }
}

nolay時間を進めますリクエストの実行を開始するには、以前はバケットから漏れるまで遅延していましたが、現在は遅延はありません。バケットに入るとすぐに実行が開始されます


Nginxの電流制限を設定する方法#すぐに実行されるか、拒否されます。スロットルによってリクエストが遅延することはなくなります。

リクエストはバケットから一定の割合で漏れ出し、バケットのスペースは固定されているため、最終的には平均して 1 秒あたり 5 件のリクエストが実行され、電流制限の目的は達成されます。

しかし、これには欠点もあり、電流制限は制限されていますが、制限はそれほど均一ではありません。上記の構成を例にとると、同時に 12 個のリクエストが到着した場合、これらの 12 個のリクエストはすぐに実行でき、後続のリクエストは一定の速度でのみバケットに入力され、100 ミリ秒ごとに 1 つのリクエストが実行されます。一定期間リクエストがなく、バケットが空の場合、12 個の同時リクエストが同時に実行される可能性があります。

ほとんどの場合、この不均一な流量は大きな問題ではありません。ただし、nginx には、同時実行を制御するためのパラメータ (nolay リクエストの数) も用意されています。

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
  location /login/ {
    limit_req zone=ip_limit burst=12 delay=4;
    proxy_pass http://login_upstream;
  }
}

delay=4 バケット内の 5 番目のリクエストから遅延を開始します


Nginxの電流制限を設定する方法このように、遅延パラメータの値を制御することで、許可される同時実行を調整できます リクエストの数はリクエストを均等にしますが、リソースを消費する一部のサービスではこの数を制御する必要があります。

以上がNginxの電流制限を設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。