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 の一時テーブルスペースを使用して落とし穴を回避する方法

推薦する

Reactイベントメカニズムソースコード分析

目次原理ソースコード分析委任されたイベントバインディングすべてのサポートされているイベントを聴くネイ...

LinuxにMySQLをインストールするための詳細なチュートリアル

すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...

8桁の割引コードをランダムに生成し、MySQLデータベースに保存します。

現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...

js 実行コンテキストとスコープの概要

目次序文文章1. JavaScriptコードの実行プロセスに関連する概念2. 実行コンテキストと実行...

Linux CRM デプロイメント コードの詳細な説明

Linuxの基本設定 Linux環境でpython3をコンパイルしてインストールする 1. Linu...

HTMLとは何ですか?

HTML 開発の歴史: HTML は英語で Hypertext Marked Language の...

要素の円弧モーションを実現する CSS3 サンプルコード

CSS を使用して要素の円弧の動きを制御する方法CSS3 の新しい属性 transfrom トランジ...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

読み取り専用と無効の違い

要約すると: Readonly は入力 (テキスト/パスワード) とテキスト領域に対してのみ有効です...

js Promise同時制御メソッド

目次質問背景アイデアと実装質問次のように、同時実行 Promise の数を制御するメソッドを記述する...

Docker の詳細なイラスト

1. Dockerの紹介1.1 仮想化1.1.1 仮想化とは何ですか?コンピュータにおける仮想化とは...

Linux における「!」の知られざる使用法のまとめ

序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...

ウェブページを作るときに知っておくべきいくつかのスキル

1. IE6 では z-index が無効です。 CSS では、階層を変更するために z-index...

Vueで複数の添付ファイルをアップロードする実装例

目次序文コアコードコードのファイル表示部分序文この記事では主に、Vue プロジェクトでの添付ファイル...

ボタンをクリックして画像を切り替える JavaScript

この記事の例では、ボタンをクリックすることで画像を切り替えることを実現するJavaScriptの具体...