nginxのは、制限速度を制限する周波数を用いて構築、保護層の同時アプリケーションを制限します
nginxのそれ自体が限界周波数、速度、同時接続数を制限する能力の基礎を提供します。
限界周波数
クライアントに基づいウリ特定の他の制限は、クライアントが確立された接続の時間一定数の期間を持続しました。
速度
制限クライアントは、データパケットの伝送速度を読み込み、全体的な、でも、ネットワークの速度制限の場合。
同時制限
クライアントは、単一のクライアントを防ぐために、接続を作成できるようにしながら制限は、サーバーのリソースが不足し、あまりにも多くの接続を作成します。
限界周波数
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http {
# 定义2条限速区域
# 以 $binary_remote_addr 字段作为限频统计点
# zone=one:10m # 定义区域名称为one,限统计总占用内存10MB
# 限制请求频率为 最多1次/per second
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# 以 $binary_remote_addr 作为统计限频的依据
# zone=zone2:32m zone名称定为zone2,定义32MB的统计内存占用
# 限制请求频率 最多10次/per minute
limit_req_zone $binary_remote_addr zone=zone2:32m rate=10r/m;
# Sets the desired logging level for cases when the server refuses to
# process requests due to rate exceeding, or delays request processing.
# Logging level for delays is one point less than for refusals;
# for example, if “limit_req_log_level notice” is specified, delays are logged with the info level.
limit_req_log_level info; # default error, <info | notice | warn | error>
limit_req_status 503; # default 503 added from nginx-1.3.15
server {
# ...
location /search/ {
# 使用zone=one的限频规则
limit_req zone=one burst=5;
# limit_req zone=zone2 burst=5 nodelay; # 使用
}
}
詳述
周波数は、ルール定義を制限する場合は、使用することができます組み込み変数$binary_remote_addr
またはユーザー定義変数。
例えば、使用$binary_remote_addr
($binary_remote_addr
様々なデータの解釈によれば$remote_addr
、整数表現の文字列「10.0.12.1」で説明のバイナリ形式、IPアドレス、この値は、単一のIPのメモリフットプリントを低減する、よりカウントすることができ多くのIPリクエスト)。
条件などの他のタイプにするために所望の速度に応じて、場合$user_agent
等が挙げられます。
$realip_remote_addr
$remote_addr
$remote_user
ビルトイン変数リストhttp://nginx.org/en/docs/varindex.html
カスタム変数を使用します
通常の状況下では、当社のサービスの前にある一般的なだけでなく保護シールドの層、または他の4階建てのLVS / haproxyおよび他の薬剤、直接使用などとして$remote_addr
/ $binary_remote_addr
ロードバランサやアドレスを保護するために取られる、制限速度はIPの実際のユーザーにつながることになりました。律速全体的なシールドのために。
年の盾
年-盾が渡されX-Connecting-Ip
、受信した最初のレベルのためにその要求のIPアドレスを設定します。
http://help.yunaq.com/faq/67/index.html
使用を容易にするためmap
のカスタム変数に記録命令$clientRealIp
map $http_x_connecting_ip $clientRealIp {
default $remote_addr;
"~(\d+\.\d+\.\d+\.\d+)" $1;
}
その後、周波数が定義への直接参照を制限します。
limit_req_zone $clientRealIp zone=zoneA:32m rate=30r/m;
limit_req_zone $clientRealIp zone=zoneB:32m rate=6r/m;
# levels info | notice | warn | error; default error
limit_req_log_level notice;
最後に、周波数保護の場所を制限します。
server {
location *~ ^/view/ {
limite_req zone=zoneA nodelay;
if ( $limit_req_status = REJECTED ) {
default_type text/plain;
return 419 "frequency limit";
}
proxy_pass http://1.1.1.1:8090;
}
location *~ ^/api/v1/ {
limit_req zone=zoneB burst=3 nodelay;
if ( $limit_req_status = REJECTED ) {
default_type application/json;
return 200 '{"code":419, "status":"failed","message":"频繁访问"}';
}
proxy_pass http://1.1.1.1:8090;
}
}
制限速度
...
同時制限
...
カスタムエラーコードとエラーページ
...
他の
nginxの場所/定期的に、マップ試運転ツールをマップ
docker run -p8080:80 -d --name nginx-regex-tester ruanzx/nginx-regex-tester