NGINX設定 · 1 min read · Oct 11, 2025

Nginxによるレート制限

この記事では、nginxのHttpLimitReqModuleを使用して、特定のセッションのリクエスト数を制限する方法を説明します。これは、例えば、ボットが毎秒複数のリクエストを行い、サーバーの負荷が増加している場合に便利です。HttpLimitReqModuleを使用すると、レート制限を定義でき、訪問者がこのレートを超えると503エラーが返されます。

1 HttpLimitReqModuleの使用

nginx.confを開きます…

nano /etc/nginx/nginx.conf

…セッション状態が保存されるエリアを定義します - これはhttp {}コンテナの内部に配置する必要があります:

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

このエリアはoneと呼ばれ、10MBのストレージが割り当てられています。変数$remote_addrの代わりに、状態のサイズを64バイトに減らす$binary_remote_addr変数を使用します。1MBのゾーンには約16,000の状態が存在できるため、10MBでは約160,000の状態が許可されるため、訪問者には十分です。レートは1秒あたり1リクエストに制限されています。ここでは整数値を使用する必要があるため、もし1秒あたり0.5リクエストに制限したい場合は、30r/m(30リクエスト/分)を使用します。

この制限を機能させるために、limit_reqディレクティブを使用します。このディレクティブはhttp {}、server {}、およびlocation {}コンテナで使用できますが、私の意見では、リクエストをアプリサーバー(PHP-FPM、mongrelなど)に渡すlocation {}コンテナで最も便利です。なぜなら、画像、CSS、JavaScriptファイルがたくさんある単一のページを読み込むと、単一のページリクエストで指定されたレート制限を超える可能性があるからです。

それでは、これをlocation ~ .php$ {}コンテナに配置しましょう:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone=one burst=5;は、このレート制限が前に定義したセッションストレージエリアに属することを指定します(zone=oneのため)つまり、レート制限は1r/sです。バーストオプションの意味をキューの一種として考えることができます。これは、レート制限を超えた場合、次のリクエストが遅延し、バーストパラメータで指定された数よりも待機中のリクエストが多い場合にのみ503エラーが返されることを意味します(例: こんな感じで:

Nginxレート制限の適用

)。

このキューを使用したくない場合(つまり、誰かがレート制限を超えた場合にすぐに503を返す場合)、nodelayオプションを使用する必要があります:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

変更を有効にするためにnginxをリロードするのを忘れないでください:

systemctl nginx reload

2 リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。