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 を使用する方法

推薦する

MySQLユーザー権限テーブルについての簡単な説明

MySQL はインストール時に自動的に mysql という名前のデータベースを作成します。mysql...

Jira リバース プロキシを実装するための nginx について

概要: nginx リバース プロキシ jira を構成し、https を実装します。Tomcat ...

Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリと my-default.ini がなく、サービスが起動できない問題の簡単な解決方法 (問題概要)

私は SQL の初心者で、オープンソースのインストールは非常に簡単だと思っていましたが、その過程でい...

複数の Docker コンテナが同じポート番号を持たない場合の解決策

背景Dockerでは、同じイメージを使用して4つのコンテナを作成します。ネットワークはブリッジモード...

ミニプログラムにより、製品属性の選択や仕様の選択が可能

この記事では、ミニプログラムで製品属性選択または仕様選択を実装するための具体的なコードを参考までに共...

Gokudōゲームにおけるフロントエンド知識のまとめ

背景日本語を学び始めた当初は、日本語の50音を覚えるのは簡単ではなく、特にカタカナを覚えるのは困難で...

MySQL フラッシュバック ツール binlog2sql の詳細なインストールと設定のチュートリアル

概要binlog2sql は、Python で開発されたオープンソースの MySQL Binlog ...

Nginx設定の原理と実装プロセスの詳細な説明https

Linuxユーティリティcertbotを使用してhttps証明書を生成するこのツールは Let&#...

MySQL 5.7.21 のインストールと設定方法のグラフィックチュートリアル (ウィンドウ)

ウィンドウ環境にmysql5.7.21をインストールします。詳細は次のとおりです。 1. MySQL...

Dockerを使用してRedisクラスターを構築する方法

目次1. Redis Dockerベースイメージを作成する2. Redisノードイメージを作成する3...

CSS3 ボタン境界アニメーションの実装

まず効果を見てみましょう: html <a href="#"> &l...

Linux のソフトリンクとハードリンクの詳細な説明

目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...

Vue3+TypeScriptは再帰メニューコンポーネントの完全な例を実装します

目次序文必要成し遂げる最初のレンダリングメニュー項目をクリックしますスタイルの区別デフォルトのハイラ...

Vue ユニットテストに関する予備調査

目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...

Docker でコンテナのポート マッピングを動的に変更する方法

前書き: Docker のポート マッピングは、多くの場合、Docker Run コマンド中に -p...