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エラーが返されることを意味します(例: こんな感じで:

)。
このキューを使用したくない場合(つまり、誰かがレート制限を超えた場合にすぐに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 reload2 リンク
- nginx: https://nginx.org/
- HttpLimitReqModule: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。