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 の一時テーブルスペースを使用して落とし穴を回避する方法
1. コマンドラインでMySQLサービスを停止します: net stop mysql stop my...
<br />このページはUTF8エンコードを使用しており、ヘッダーとフッターはテンプレー...
次のコードは、MySQL が 1 つのテーブルのデータに基づいて別のテーブルのいくつかのフィールドを...
目次MySQL 制約操作1. 非ヌル制約2. ユニーク制約3. 主キー制約4. 外部キー制約5. カ...
目次マハ1. MAHアーキテクチャの概要2. 適用可能なシナリオ3. MHAの動作原理4. MHAの...
序文この記事は主に、MYSQL でランキングを実現し、指定ユーザーランキング関数 (並列ランキング関...
背景Dockerでは、同じイメージを使用して4つのコンテナを作成します。ネットワークはブリッジモード...
MySQLデータベースをインストールするa) MySQL ソースインストールパッケージをダウンロード...
質問: index.html で、iframe が son.html を導入します。son.html...
概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...
3D座標の概念要素が回転すると、その座標軸も一緒に回転します。注 -y方向の問題立方体を回転させる効...
序文データベースは常に私の弱点でした。自分の経験 (python+sqlalchemy) を組み合わ...
序文日常のコード開発では、配列のソートに関連する操作が多数あります。JavaScript では、so...
この記事では、従業員管理登録ページを実装するためのjQueryの具体的なコードを例として紹介します。...
Rancher のデプロイメントには、次の 3 つのアーキテクチャがあります。高可用性 Kubern...