我正在研究使用nginx的HttpLimitReqModule进行速率限制。但是,请求全部来自同一IP(负载平衡器),标头中包含真实IP地址。
有没有一种方法可以使nginx速率限制基于X-Forwarded-For
标题中的ip而不是源的ip?
我正在研究使用nginx的HttpLimitReqModule进行速率限制。但是,请求全部来自同一IP(负载平衡器),标头中包含真实IP地址。
有没有一种方法可以使nginx速率限制基于X-Forwarded-For
标题中的ip而不是源的ip?
Answers:
是的,典型的限速配置定义字符串如下所示:
limit_req_zone $binary_remote_addr zone=zone:16m rate=1r/s;
$binary_remote_addr
限制器的唯一键在哪里。您应该尝试将其更改为$http_x_forwarded_for
获取X-Forwarded-For
标头值的变量。尽管由于$binary_remote_addr
使用压缩二进制格式存储IP地址(而$http_x_forwarded_for
不是使用压缩二进制格式),这会增加内存消耗。
limit_req_zone $http_x_forwarded_for zone=zone:16m rate=1r/s;
$binary_remote_addr
正确设置变量。
所述limit_req_zone
指令定义要被用作用于请求分组关键变量。
通常,$binary_remote_addr
使用而不是$remote_addr
因为较小,并且节省空间。
也许您也想使用RealipModule。
这会将远程地址变量重写为自定义标头中提供的地址,还将使日志记录和其他变量的使用更加容易。
$binary_remote_addr
并$remote_addr
设置为您配置的头部,通常的价值X-Forwarded-For
-让你的标准变量现在“真正的客户端IP地址”。运行nginx -V
以查看NGINX是否使用编译--with-http_realip
。然后config就像:一样简单 set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;
,其中CIDR范围是设置X-Forwarder-For
标头的上游负载均衡器的范围。