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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法
目次タイムスタンプ比較クエリで遭遇する落とし穴タイムスタンプクエリ範囲の問題タイムスタンプ比較クエリ...
序文通常、h5 ページを作成するときは、WeChat、QQ、Weibo などのエコシステム内でトラフ...
Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...
目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...
この記事では、参考までに、簡単な計算機能を実装するためのJavaScriptの具体的なコードを紹介し...
CentOS 7.3のインストール手順を図解しました。具体的な内容は次のとおりです。この記事では、v...
1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...
序文スロー クエリ ログは、MySQL で非常に重要な機能です。MySQL のスロー クエリ ログ機...
MySQLでは、2つ以上のベーステーブルにビューを作成します。学生テーブルとstu_infoテーブル...
序文ブロガーはアイデアIDEを使用しています。アイデア公式が最近サードパーティのアクティベーションサ...
この記事では、MySQL ユーザー権限管理の例について説明します。ご参考までに、詳細は以下の通りです...
このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...
「人間中心」と「グリーンデザイン」という2つの視点から考える——デザイン業界の同僚とも議論する2つの...
なぜ権限管理が必要なのでしょうか? 1. コンピュータ リソースは限られているため、コンピュータ リ...
この記事では、テーブルの動的な色の変更を実現するためのJavaScriptの具体的なコードを参考まで...