Nginx で limit_req_zone を使用して同じ IP へのアクセスを制限する方法

Nginx で limit_req_zone を使用して同じ IP へのアクセスを制限する方法

Nginx は、ngx_http_limit_req_module モジュールの limit_req_zone ディレクティブを使用してアクセスを制限し、ユーザーが悪意を持ってサーバーを攻撃して過負荷状態にするのを防ぐことができます。 ngx_http_limit_req_module モジュールは nginx にデフォルトでインストールされているため、直接設定できます。

まず、nginx.confファイルのhttpモジュールの下で設定します。

limit_req_zone $binary_remote_addr ゾーン=one:10m レート=1r/s;

注意: エリア名は 1 (カスタム)、占有スペースのサイズは 10 m、平均リクエスト頻度は 1 秒あたり 1 回を超えることはできません。

$binary_remote_addr は $remote_addr (クライアント IP) のバイナリ形式で、4 バイト (おそらく C 言語の long 型の長さ) に固定されています。 $remote_addr は文字列として保存され、7〜15 バイトを占めます。 $binary_remote_addr を使用するとスペースを節約できるようですが、インターネットでは 64 ビット システムはすべて 64 バイトを占有すると書かれています。よくわかりません。とにかく、$binary_remote_addr を使用してみてください。

次に、httpモジュールのサブモジュールサーバの下で設定します。

場所 ~* .htm$ {
limit_req ゾーン=1 バースト=5 ノードレイ;
proxy_pass http://backend_tomcat;
}

ここでは、URI サフィックス htm を使用してリクエストを制限します。limit_req zone=one burst=5 nodelay; に注意してください。

ここで、zone=one は前の定義に対応します。

バーストという言葉は、インターネットではピーク値と呼ばれることがよくあります。しかし、個人的な実験を通じて、これは正確ではないことがわかりました。バッファ キューの長さと呼ぶべきです。

Nodelay は文字通り遅延がないことを意味します。具体的には、ユーザー リクエストが遅延されずにすぐに処理されることを意味します。たとえば、上で定義したレートは 1r/s ですが、これは 1 秒あたり 1 つのリクエストのみが処理されることを意味します。接尾辞 htm を持つ 2 つのリクエストが同時に到着した場合、nodelay が設定されていれば、これら 2 つのリクエストは直ちに処理されます。 nodelay が設定されていない場合、rate=1r/s 構成が厳密に適用されます。つまり、1 つのリクエストのみが処理され、次の 1 秒後に別のリクエストが処理されます。直感的に、ページデータがスタックしており、読み込みに 1 秒かかります。

電流制限に実際に機能する構成は、レート = 1r/s およびバースト = 5 です。以下、具体的な事例を分析してみましょう。

ある瞬間に、2 つのリクエストが同時に nginx に到着し、そのうちの 1 つは処理され、もう 1 つはバッファ キューに配置されます。 nodelay は 2 番目のリクエストが即座に処理されるように設定されていますが、それでもバッファ キューの一定の長さを占有します。次の 1 秒間にリクエストが来ない場合、バースト長によって占有されていたスペースが解放されます。それ以外の場合は、バースト スペースが 5 を超えるまでバースト スペースを占有し続けます。その後、それ以降のリクエストは nginx によって直接拒否され、503 エラー コードが返されます。

2 秒目にさらに 2 つのリクエストが来ると、リクエストの 1 つが別のバースト スペースを占有することがわかります。3 秒目、4 秒目、5 秒目には、1 秒ごとに 2 つのリクエストが来ます。両方のリクエストが処理されますが (nodelay が設定されているため)、リクエストの 1 つがまだバースト長を占有しています。5 秒後、バースト長 = 5 全体が占有されます。 6 秒以内にさらに 2 つのリクエストが届き、そのうち 1 つは拒否されました。

これは実際のテスト結果に基づいた私の推論です。実際の理論とは異なるかもしれませんが、この方が理解しやすいと思います。答えを知っている人はぜひ教えてください!

ここで使用される $binary_remote_addr は、クライアントと nginx の間にプロキシ層がない場合に使用されます。 nginx の前に CDN を設定する場合、$binary_remote_addr の値は CDN の IP アドレスになります。流れを制限するのは正しくありません。電流制限を行うには、ユーザーの実際の IP アドレスを取得する必要があります。

簡単な説明は次のとおりです。

## ここで元のユーザーの IP アドレスを取得します。map $http_x_forwarded_for $clientRealIp {
"" $リモートアドレス;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}

## 元のユーザーの IP アドレスを制限します limit_req_zone $clientRealIp zone=one:10m rate=1r/s;

同様に、制限モジュールを使用して Web クローラーのフローを制限することもできます。

http モジュール

limit_req_zone $anti_spider ゾーン=anti_spider:10m レート=1r/s;

サーバーモジュール

位置 / {

limit_req ゾーン=アンチスパイダー バースト=2 ノードレイ;
$http_user_agent の場合、"スパイダー|Googlebot") {
$anti_spider $http_user_agent を設定します。
}

}

curl -I -A "Baiduspider" www.remotejob.cn/notice.jsp でテストできます。

Nginx で limit_req_zone を使用して同一 IP のアクセスを制限する上記の方法は、エディターが皆さんと共有する内容のすべてです。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • モジュールへのアクセスを制限するNginxの制限方法
  • nginx を使用して分散電流制限を実装する方法
  • 1 つの記事で Nginx の現在の制限を理解する (簡単な実装)
  • Nginx サーバーが IP アクセスを制限するさまざまな状況の完全な分析
  • Nginxは、同じ期間内の特定のIPへの訪問とリクエストの数を制限します。サンプルコード
  • ネットワークセグメント内の IP アドレスに対する Nginx の接続制限設定の詳細な説明
  • nginx で limit_req レート制限を設定する例

<<:  JavaScript で同時実行制御を実装する方法

>>:  MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

推薦する

Windows 7 の mysql6.x で中国語の文字化けが発生する問題に対する完璧な解決策

1. コマンドラインでMySQLサービスを停止します: net stop mysql stop my...

UTF8 でエンコードされた Web ページにファイルが含まれている場合の、ページの前の空白行の解決方法

<br />このページはUTF8エンコードを使用しており、ヘッダーとフッターはテンプレー...

MySQL は、あるテーブルのデータに基づいて別のテーブルの特定のフィールドを更新します (SQL ステートメント)

次のコードは、MySQL が 1 つのテーブルのデータに基づいて別のテーブルのいくつかのフィールドを...

MySQL 制約の超詳細な説明

目次MySQL 制約操作1. 非ヌル制約2. ユニーク制約3. 主キー制約4. 外部キー制約5. カ...

MySQL で MHA アーキテクチャのデプロイメントを構築する手順

目次マハ1. MAHアーキテクチャの概要2. 適用可能なシナリオ3. MHAの動作原理4. MHAの...

MYSQL は、指定されたユーザーのランキングとクエリを実装します。ランキング関数 (並列ランキング関数) のサンプルコード

序文この記事は主に、MYSQL でランキングを実現し、指定ユーザーランキング関数 (並列ランキング関...

複数の Docker コンテナが同じポート番号を持たない場合の解決策

背景Dockerでは、同じイメージを使用して4つのコンテナを作成します。ネットワークはブリッジモード...

クラスタrpmを使用してMySQLをインストールするための詳細な手順

MySQLデータベースをインストールするa) MySQL ソースインストールパッケージをダウンロード...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

CSS3 回転キューブ問題の詳細な説明

3D座標の概念要素が回転すると、その座標軸も一緒に回転します。注 -y方向の問題立方体を回転させる効...

MySQLをシンプルに学ぶ

序文データベースは常に私の弱点でした。自分の経験 (python+sqlalchemy) を組み合わ...

JavaScript 配列 sort() メソッドの基本的な使い方と落とし穴

序文日常のコード開発では、配列のソートに関連する操作が多数あります。JavaScript では、so...

jQuery で従業員管理登録ページを実装する

この記事では、従業員管理登録ページを実装するためのjQueryの具体的なコードを例として紹介します。...

Rancher のデプロイメントと K8S クラスターのインポートに関する問題

Rancher のデプロイメントには、次の 3 つのアーキテクチャがあります。高可用性 Kubern...