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

推薦する

MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

目次タイムスタンプ比較クエリで遭遇する落とし穴タイムスタンプクエリ範囲の問題タイムスタンプ比較クエリ...

JavaScript を使用して userAgent を通じていくつかの一般的なブラウザを判別する方法

序文通常、h5 ページを作成するときは、WeChat、QQ、Weibo などのエコシステム内でトラフ...

Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

JavaScriptはシンプルな計算機能を実装します

この記事では、参考までに、簡単な計算機能を実装するためのJavaScriptの具体的なコードを紹介し...

VMWare に CentOS 7.3 をインストールするグラフィカル チュートリアル

CentOS 7.3のインストール手順を図解しました。具体的な内容は次のとおりです。この記事では、v...

Docker ベースの nginx ファイル サーバーを構築する方法と手順

1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...

MySQL でスロークエリを有効にする方法の例

序文スロー クエリ ログは、MySQL で非常に重要な機能です。MySQL のスロー クエリ ログ機...

MySQL で複数のテーブルにビューを作成する方法

MySQLでは、2つ以上のベーステーブルにビューを作成します。学生テーブルとstu_infoテーブル...

ローカルアイデアアクティベーションサーバーの構築に関する詳細なチュートリアル

序文ブロガーはアイデアIDEを使用しています。アイデア公式が最近サードパーティのアクティベーションサ...

MySQL ユーザー権限管理の分析例

この記事では、MySQL ユーザー権限管理の例について説明します。ご参考までに、詳細は以下の通りです...

最も完全な 50 の MySQL データベース クエリ演習

このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...

デザイン理論:人間中心のグリーンデザイン

「人間中心」と「グリーンデザイン」という2つの視点から考える——デザイン業界の同僚とも議論する2つの...

知らないかもしれないLinuxのファイル権限管理方法

なぜ権限管理が必要なのでしょうか? 1. コンピュータ リソースは限られているため、コンピュータ リ...

テーブルの動的な色の変更を実現するJavaScript

この記事では、テーブルの動的な色の変更を実現するためのJavaScriptの具体的なコードを参考まで...