需要对某个域名下的所有请求速率进行限制,如下配置,设置每个独立的ip每秒只能请求一次,通过geo和map的方式设置白名单,白名单内的ip地址将不做限制,如下配置完成使用jmeter压测发现限制生效了白名单不生效(确认客户端ip没配置错),白名单不生效的原因是什么?
# http处配置限流
http {
...
# rate limit
geo $whitelist {
default 0;
192.168.1.1/32 1;
}
map $whitelist $limit {
0 $binary_remote_addr;
1 "";
}
limit_req_zone $limit zone=perip:10m rate=1r/s;
limit_req_log_level warn;
}
# server中引用
server {
....
limit_req zone=perip burst=2 nodelay;
}
白名单不生效的原因可能在于负载均衡器(如阿里云SLB)的透明代理设置导致Nginx获取到的客户端真实IP并非原始客户端IP。在负载均衡器场景下,请求到达Nginx之前,负载均衡器会替换掉原有的TCP/IP头部信息,因此Nginx看到的$remote_addr和$binary_remote_addr将是负载均衡器自身的IP地址而非原始客户端IP。
在Nginx配置中启用并正确配置real_ip_header指令以解析负载均衡器传递过来的真实客户端IP。阿里云SLB一般会通过HTTP头X-Forwarded-For传递真实的客户端IP。
在Nginx配置中加入以下内容: