Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

1. アクセス頻度、同時接続、ダウンロード速度を制限するために使用されるモジュールと命令の概要

  • ngx_http_limit_req_module: 単位時間あたりのリクエスト数を制限するために使用します。つまり、リーキー バケット アルゴリズム「リーキー バケット」を使用してレート制限を行います。
  • ngx_http_limit_conn_module: 同時接続数、つまり同時接続数の制限に使用されます
  • limit_rate と limit_rate_after: ダウンロード速度の設定

リーキーバケットアルゴリズム

アルゴリズムのアイデアは次のとおりです。

  • 水(要求)は上からバケツに注がれ、バケツの底から流れ出る(処理される)
  • 時間内に流出できない水はバケツ(バッファ)に貯められ、一定速度で流出します。
  • バケツがいっぱいになると水があふれます(捨てられます)。
  • このアルゴリズムの中核は、リクエストをキャッシュし、均一な速度で処理し、冗長なリクエストを直接破棄することです。
  • Nginx のリクエスト レート制限モジュールは、リーキー バケット アルゴリズムを使用して、リクエストのリアルタイム処理速度が設定されたしきい値を超えないように強制的に保証します。

2. URLアクセス要求頻度を制限する

http{ 
    ... 
 
  limit_req_zone $binary_remote_addr ゾーン=1:30m レート=20r/s; 
  limit_req_zone $binary_remote_addr $uri ゾーン=2:30m レート=20r/s; 
  limit_req_zone $binary_remote_addr $request_uri ゾーン=3:30m レート=20r/s; 
  制限要求ステータス 444; 
    ... 
 
  サーバ{ 
      ... 
 
    limit_req ゾーン=2 バースト=15 ノードレイ; 
    ... 
 
  } 
} 

説明する:

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

  • $binary_remote_addrは、同じクライアントIPアドレスを異なるURLに制限します。
  • ゾーン: ゾーン名 1 はセッション 30M を保存します
  • レート: 1秒あたりのリクエスト数

limit_req_zone $binary_remote_addr $uri ゾーン=2:30m レート=20r/s;

  • $binary_remote_addr $uriは同じクライアントIPアドレスを同じURLに制限します
  • ゾーン: ゾーン名 2店舗 セッション 30M
  • レート: 1秒あたりのリクエスト数

limit_req_zone $binary_remote_addr $request_uri ゾーン=3:30m レート=20r/s;

  • $binary_remote_addr $request_uriは同じクライアントIPアドレスを同じURLに制限します
  • ゾーン: ゾーン名 2店舗 セッション 30M
  • レート: 1秒あたりのリクエスト数

limit_req ゾーン=2 バースト=15 ノードレイ;

  • ゾーン参照領域は2つです。
  • burst はサイズ 15 のバッファを設定します。大量のリクエスト (バースト) が到着すると、アクセスが上記の制限を超え、最初にバッファに配置されることがあります。
  • Nodelay は通常、burst と一緒に使用されます。nodelay が設定されている場合、アクセスが頻度を超えてバッファがいっぱいになると、503 が直接返されます。設定されている場合、すべての大きなリクエストは順番に待機します。

3. 同時接続制限

ケース1:

http { 
  ... 
 
  limit_conn_log_level エラー; 
  limit_conn_zone $binary_remote_addr ゾーン=addr:10m; 
  制限接続ステータス 503; 
 
  ... 
 
  サーバー{ 
 
    ... 
 
    場所 /download/ { 
      limit_conn addr 1; 単一のクライアントIPは1に制限されます 
    } 
    ... 
 
} 

ケース2:

http{ 
limit_conn_zone $binary_remote_addr ゾーン=perip:10m; 
limit_conn_zone $server_name ゾーン=サーバーあたり:10m; 
 
  サーバー{ 
    ... 
    limit_conn perip 10; #単一のクライアント IP とサーバー間の接続数 limit_conn perserver 100; #サーバーへの接続総数を制限} 
} 

4. ダウンロード速度を制限する

場所 /ダウンロード { 
  制限レート 128k; 
 } 
 
#ファイルの最初の10mを速度制限なしでダウンロードし、10mを超えた後は速度を128kb/sに制限するように設定したい場合は、次のコンテンツの場所/download {を追加します。 
    10分後に制限レートを設定します。 
    制限レート 128k; 
 } 

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 悪意のあるクローラーの頻度を制限するために nginx 設定を変更する
  • nginx で単位時間あたりのアクセス頻度を制限するチュートリアル
  • 検索エンジンのクローラーの頻度を制限し、Web クローラーのブロックを禁止する Nginx 構成の例

<<:  mysql 実行プラン ID が空である (UNION キーワード) の詳細な説明

>>:  Vue で Axios 非同期リクエスト API を使用する方法

推薦する

JavaScript でカルーセル効果を実装する

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...

Vue が学ぶべき知識ポイント: forEach() の使用

序文フロントエンド開発では、目的のコンテンツを取得するためにループをトラバースする必要がある状況に頻...

高い同時実行性の下でNginxのパフォーマンスを最適化する方法をまとめます

目次特徴利点インストールとコマンド設定ファイルプロキシモードとリバースプロキシ構成フォワードプロキシ...

Dockerfile を使用して SpringBoot プロジェクトをデプロイする方法

1. SpringBoootプロジェクトを作成し、jarパッケージにパッケージ化する2. Linux...

HTMLタグを閉じるのを忘れないでください

Web 標準に準拠した Web ページの構築は、jb51.net が常に全員と議論しているトピックで...

MySQLの3つの用途と違いは同等ではない

MySQLでは判定記号がよく使われますが、等しくない記号はもっと一般的に使われます。次の3つの等しく...

Chrome 4.0 は GreaseMonkey スクリプトをサポートします

GreaseMokey (中国語では Grease Monkey Script と呼んでいます) は...

フロントエンドの面接でよく聞かれる JavaScript の質問の完全なリスト

目次1. 手書きのインスタンス2.配列のマップメソッドを実装する3. Reduceは配列のmapメソ...

MYSQLについては、データ型と操作テーブルを知る必要があります

データ型と操作データテーブル1.1 MySQL 型: 整数 1.2 MySQL データ型: 浮動小数...

VSCode と SSH を使用したリモート開発

0. リモート開発が必要な理由組み込み Linux を開発する場合、便宜上、通常は Windows ...

CSS の ::before と ::after 疑似要素について知らないこと

CSS には、一般的には使用されない 2 つの疑似クラス、before と :after があります...

docker を使用した pxc クラスターのインストールに関する詳細なチュートリアル

目次序文事前準備ディレクトリを作成するcustom.cnf を作成する証明書を作成するpxc クラス...

vsFTP 3.0.3 のコンパイルとインストールの詳細な分析

脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...

フレックスレイアウトでコンテナ内のコンテンツを維持するためのソリューションの詳細な説明

モバイル側では、フレックスレイアウトが非常に便利です。デバイスの幅に応じてコンテナの幅を自動的に調整...