nginx 限流配置白名单不生效?

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

}
阅读 2.2k
1 个回答

白名单不生效的原因可能在于负载均衡器(如阿里云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;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题