ホームページ  >  記事  >  運用・保守  >  Nginx 制限リクエストレート構成を実装する方法

Nginx 制限リクエストレート構成を実装する方法

WBOY
WBOYオリジナル
2023-11-08 13:46:571405ブラウズ

Nginx 制限リクエストレート構成を実装する方法

Nginx 制限リクエスト レート構成を実装する方法

Nginx は、構成を通じてリクエストを制限および制御できる高性能 Web サーバーです。実際のアプリケーションでは、サーバー リソースを保護するために、リクエスト レートを制限することが必要になることがよくあります。この記事では、Nginxでリクエストレート制限を実装する方法を紹介します。

1. HttpLimitReqModule モジュールを使用する

Nginx は、リクエスト レートを制限するために使用できる HttpLimitReqModule モジュールを提供します。構成を開始する前に、HttpLimitReqModule モジュールがインストールされていることを確認する必要があります。

  1. Nginx 構成ファイルの編集

Nginx 構成ファイル (通常は /etc/nginx/nginx.conf にあります) を開き、http セクションを見つけて、次の構成を追加します。 :

http {
    ...
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        ...
    }
}

limit_req_zone は、制限された領域の名前とサイズを定義するために使用され、$binary_remote_addr は、クライアントの IP アドレスを制限されたキーワードとして使用することを示します。 zone=one:10m は、サイズが 10MB の one という名前の制限領域を使用することを意味します。 rate=1r/s は、リクエスト レートが 1 秒あたり 1 に制限されることを意味します。

  1. リクエスト制限の構成

リクエスト制限が必要な場合は、limit_req ディレクティブを追加してリクエスト レートを制限します。たとえば、リクエスト レートを 10 リクエスト/秒に制限するには、サーバー セグメントに次の設定を追加できます。

location / {
    limit_req zone=one burst=5;
    ...
}

limit_req ディレクティブを使用してリクエスト制限を適用し、zone パラメータでリクエストの名前を指定します。使用される制限ゾーン、およびバースト パラメータで同時に指定される時間、処理された要求の数。上記の設定は、リクエスト数が 10/秒を超えると 503 エラーが返されることを示しています。

  1. Nginx 構成のリロード

構成が完了したら、Nginx 構成を再ロードして有効にする必要があります。次のコマンドを使用して構成を確認して再ロードできます:

$ nginx -t    # 检查配置是否正确
$ nginx -s reload    # 重新加载配置

2. ngx_http_limit_req_module モジュールを使用します

HttpLimitReqModule モジュールに加えて、ngx_http_limit_req_module モジュールを使用してリクエストを制限することもできますレート。このモジュールは、より柔軟な構成オプションを提供します。

  1. Nginx 構成ファイルの編集

Nginx 構成ファイルを開き、http セグメントを見つけて、次の構成を追加します:

http {
    ...
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    
    server {
        ...
    }
}

この構成はHttpLimitReqModule モジュールと同様に、1 という名前の制限領域が定義されており、サイズは 10MB、要求レート制限は 1/秒です。

  1. リクエスト制限の構成

リクエスト制限が必要な場合は、limit_req ディレクティブを追加してリクエスト レートを制限します。たとえば、リクエスト レートを 10 リクエスト/秒に制限するには、サーバー セグメントに次の設定を追加できます。

location / {
    limit_req zone=one burst=5;
    ...
}

limit_req ディレクティブを使用してリクエスト制限を適用し、zone パラメータでリクエストの名前を指定します。使用される制限ゾーン、およびバースト パラメータで同時に指定される時間、処理された要求の数。

  1. Nginx 構成のリロード

構成が完了したら、Nginx 構成を再ロードして有効にする必要があります。次のコマンドを使用して、構成を確認して再ロードできます。 。

$ nginx -t    # 检查配置是否正确
$ nginx -s reload    # 重新加载配置

3. lua スクリプトを使用してリクエスト制限を拡張する

Nginx は、lua スクリプトを使用してリクエスト制限を拡張することもサポートしています。カスタム Lua スクリプトを作成することにより、より柔軟で複雑なリクエスト制限戦略を実装できます。

  1. lua モジュールのインストール

まず、Nginx lua モジュールがインストールされていることを確認する必要があります。

  1. lua スクリプトの作成

Nginx 構成ファイルに次の構成を追加します:

http {
    ...
    lua_shared_dict limit_req_store 10m;
    
    server {
        ...
        
        location / {
            access_by_lua_block {
                local limit_req = require "resty.limit.req"
                local lim, err = limit_req.new("limit_req_store", 1, 1)
                if not lim then
                    ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)
                    return ngx.exit(500)
                end
                local key = ngx.var.binary_remote_addr
                local delay, err = lim:incoming(key, true)
                if not delay then
                    if err == "rejected" then
                        return ngx.exit(503)
                    end
                    ngx.log(ngx.ERR, "failed to limit req: ", err)
                    return ngx.exit(500)
                end
                if delay >= 0.001 then
                    ngx.sleep(delay)
                end
            }
            ...
        }
    }
}

この構成では、lua_shared_dict ディレクティブを使用して、limit_req_store Shared を定義します。メモリ領域、サイズは10MBです。

  1. Nginx 構成のリロード

構成が完了したら、Nginx 構成をリロードして有効にします。

4. 概要

この記事では、Nginx リクエスト レート制限を実装する 3 つの方法、つまり HttpLimitReqModule モジュール、ngx_http_limit_req_module モジュール、lua スクリプトを使用する方法を紹介します。適切な構成と制限ポリシーにより、サーバー リソースを効果的に保護し、悪意のあるリクエストによってサーバーに過剰な負荷がかかるのを防ぐことができます。実際のアプリケーションでは、特定のニーズに応じて、適切な方法を選択してリクエスト レートを制限できます。

以上がNginx 制限リクエストレート構成を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。