前置了解
Nginx 对并发的支持
http {
limit_conn_zone $http_user_agent zone=perua:10m;
server {
location / {
……
limit_conn perua 5;
……
}
}
}
上述配置解释:
zone=perua。设置作用域,所有需要使用该limit策略的限制目标,指定作用域为该ua即可。
limit_conn perua 5。表示限制同一个user_agent的最高连接数为5。实质含义表现:如果某个user_agent已经向某个server发出了5个请求,并且请求还未返回,那么来自该user_agent的新请求将会被拒绝。
支持对不同ua差异化限流
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 创建一个map对象,指定ua的白名单
map $http_user_agent $types_ua {
default 0; # 默认
one 1; # 定义第一类ua,类型为1.
one1 1;
one2 1;
one3 1;
two 2; # 定义第二类ua,类型为2.
two1 2;
two2 2;
two3 2;
three 3; # 定义第三类ua,类型为3。
three1 3;
three2 3;
three3 3;
}
# 定义default作用域及访问速率
limit_req_zone $default zone=default_req_zone:10m rate=5r/m;
limit_conn_zone $default zone=default_conn_zone:10m;
# 定义one作用域及访问速率
limit_req_zone $one zone=one_req_zone:10m rate=5r/m;
limit_conn_zone $one zone=one_conn_zone:10m;
# 定义two作用域及访问速率
limit_req_zone $two zone=two_req_zone:10m rate=5r/m;
limit_conn_zone $two zone=two_conn_zone:10m;
# 定义three作用域及访问速率
limit_req_zone $three zone=three_req_zone:10m rate=5r/m;
limit_conn_zone $three zone=three_conn_zone:10m;
server {
listen 8080;
server_name localhost;
location /delayProcess {
limit_req_status 429;
limit_conn_status 429;
proxy_pass ${server_addr};
# 定义默认ua规则
limit_req zone=default_req_zone burst=20 nodelay;
limit_conn default_conn_zone 5;
# 定义类型一ua规则
limit_req zone=one_req_zone burst=20 nodelay;
limit_conn one_conn_zone 10;
# 定义类型二ua规则
limit_req zone=two_req_zone burst=20 nodelay;
limit_conn two_conn_zone 15;
# 定义类型三ua规则
limit_req zone=three_req_zone burst=20 nodelay;
limit_conn three_conn_zone 20;
# 白名单匹配:默认类型走default规则
if ($types_ua = 0) {
set $default $http_user_agent;
}
# 白名单匹配:1号类型走1号规则
if ($types_ua = 1) {
set $one $http_user_agent;
}
# 白名单匹配:2号类型走2号规则
if ($types_ua = 2) {
set $two $http_user_agent;
}
# 白名单匹配:3号类型走3号规则
if ($types_ua = 3) {
set $three $http_user_agent;
}
}
error_page 500 502 503 504 /50x.html;
error_page 429 /429;
location = /429 {
default_type application/json;
add_header Content-Type 'text/html; charset=utf-8';
return 200 '{"code":"429,"msg":"访问高峰期..."}\n';
}
location = /50x.html {
root html;
}
}
include servers/*;
}
评论