nginx 限流配置白名单不生效?-灵析社区

MaxClick

需要对某个域名下的所有请求速率进行限制,如下配置,设置每个独立的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; }

阅读量:140

点赞量:0

问AI
白名单不生效的原因可能在于负载均衡器(如阿里云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配置中加入以下内容: set_real_ip_from 0.0.0.0/0; # 允许信任来自任何上游服务器的IP(这里是SLB的IP) real_ip_header X-Forwarded-For; # 指定HTTP头名称以获取真实IP real_ip_recursive on; # 如果有多层代理,递归查找最后一个非内部IP # 然后在geo和map配置中使用$real_ip geo $whitelist {...} map $real_ip $limit {...} limit_req_zone $limit zone=perip:10m rate=1r/s;