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

推薦する

Linuxでテキスト比較を実現するコツを教えます

序文コードを書く過程で、必然的にコードに何らかの変更を加えることになります。しかし、変更を加えるとき...

MySQL で distinct メソッドを使用する詳細な例

明確な意味: distinctive は、一意のレコードの数を照会するために使用されます。つまり、d...

MySQL ストアド関数の詳細な紹介

目次1. ストアド関数を作成する2. ストアド関数の呼び出し3. 保存された関数を削除する4. スト...

HTTP ヘッダー情報の解釈と分析 (詳細概要)

HTTP ヘッダーの説明1. Accept: Web サーバーに受け入れるメディア タイプを通知しま...

mysql replace into の使用法の詳細な説明

replace ステートメントは、一般的に insert ステートメントに似ています。ただし、テーブ...

CSS で 2 列レイアウトを実現する N 通りの方法

1. 2 列レイアウトとは何ですか? 2 列レイアウトには、左側が固定幅で右側が適応幅のレイアウトと...

JS でシンプルな画像カルーセル効果を実現

この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...

CSS3 のカラー値 RGBA とグラデーションカラーの使用方法の紹介

CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...

Web スライスとは何ですか?

IE8 の新機能 Web スライス (Web スライス) Microsoft は 3 月 20 日...

thead、tfoot、tbodyを使用して表を作成します

これらの 3 つのタグを間違った方法で使用して、タイトルを表に沿わせたり、tbody の高さを固定し...

いくつかの重要なMySQL変数

MySQL 変数は数多くありますが、その中には注目に値するものもあります。ここでは、参考までに、注目...

PrometheusはGrafanaディスプレイを使用してMySQLを監視します

目次Prometheusはエクスポーターを介してMySQLを監視し、Grafanaチャートで表示しま...

ウェブページのCSSの優先順位について詳しく説明します

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

CentOS6.8 は cmake を使用して MySQL5.7.18 をインストールします。

オンライン情報を参考に、cmakeを使用してCentOS6.8サーバーにMySQL5.7.18をイン...

React+TypeScriptプロジェクト構築事例解説

React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...