limit_req
サーバーへのすべてのリクエストをレート制限するために使用できます。
ただし、特定のIPアドレス(つまり、ホワイトリスト)のレート制限を削除し、特定のIPアドレス(つまり、1r / sにしたい特定のIP)に異なるレート制限を使用したいと思います。
条件(たとえばif ( $remote_addr = "1.2.3.4" ) {}
)を使用してみましたが、レート制限ルールではなく、書き換えルールでのみ機能するようです。
limit_req
サーバーへのすべてのリクエストをレート制限するために使用できます。
ただし、特定のIPアドレス(つまり、ホワイトリスト)のレート制限を削除し、特定のIPアドレス(つまり、1r / sにしたい特定のIP)に異なるレート制限を使用したいと思います。
条件(たとえばif ( $remote_addr = "1.2.3.4" ) {}
)を使用してみましたが、レート制限ルールではなく、書き換えルールでのみ機能するようです。
回答:
「if」ディレクティブの使用を避ける方が本当に良いです。limit_req_zone(およびlimit_conn_zone)のキーが空の場合、制限は適用されません。これをマップおよびジオモジュールと組み合わせて使用して、スロットル制限が適用されないIPのホワイトリストを作成できます。
この例は、単一のIPからの同時要求と要求レートの両方の制限を構成する方法を示しています。
http {
geo $whitelist {
default 0;
# CIDR in the list below are not limited
1.2.3.0/24 1;
9.10.11.12/32 1;
127.0.0.1/32 1;
}
map $whitelist $limit {
0 $binary_remote_addr;
1 "";
}
# The directives below limit concurrent connections from a
# non-whitelisted IP address to five
limit_conn_zone $limit zone=connlimit:10m;
limit_conn connlimit 5;
limit_conn_log_level warn; # logging level when threshold exceeded
limit_conn_status 503; # the error code to return
# The code below limits the number requests from a non-whitelisted IP
# to one every two seconds with up to 3 requests per IP delayed
# until the average time between responses reaches the threshold.
# Further requests over and above this limit will result
# in an immediate 503 error.
limit_req_zone $limit zone=one:10m rate=30r/m;
limit_req zone=one burst=3;
limit_req_log_level warn;
limit_req_status 503;
ゾーンディレクティブはhttpレベルに配置する必要がありますが、他のディレクティブは、サーバーまたはロケーションレベルなど、さらに下に配置して、スコープを制限したり、制限をさらに調整したりできます。
詳細については、Nginxのドキュメントngx_http_limit_req_moduleおよびngx_http_limit_conn_moduleを参照してください
geo
が続くmap
というだけの使用よりも、geo
設定する$limit
直接?
geo
変数にマッピングできないようですので$binary_remote_addr
、マッピング値として指定する"$binary_remote_addr"
と、変数の値ではなくリテラル文字列に変換されます。
if()ブロックで「@location」などの名前付きの場所を安全に使用できます。
参照:http : //wiki.nginx.org/IfIsEvil
このような何かが動作するはずです:
http {
limit_req_zone $binary_remote_addr zone=delay:10m rate=1r/m;
server {
...
error_page 410 = @slowdown;
if( $remote_addr != "1.2.3.4" ) {
return 410;
}
location @slowdown {
limit_req zone=delay burst 5;
...
}
location / {
...
}
}
「location @slowdown {}」に、「location / {}」と同じ情報を入力します。たとえば、nginxをリバースプロキシとして使用している場合は、proxy_passを入力します。
error_page
トリック、+ 1!@svrist、参照serverfault.com/a/870170/110020完全にこのような何かがうまくいく方法の説明、およびその理由のために。