我们需要用nginx阻止IP地址的大量请求。 这些请求由一个CDN代理,所以我们不能阻塞实际的客户端IP地址(这将是CDN的IP地址,而不是实际的客户端)。 所以,我们有$ http_x_forwarded_for其中包含我们需要阻止给定的请求的IP。
同样,我们也不能使用IP表,因为阻塞代理客户端的IP地址将不起作用。 我们需要使用nginx来根据$ http_x_forwarded_for的值来阻止请求。
最初,我们尝试了多个简单的if语句: http : //pastie.org/5110910
但是,这导致我们的nginx内存使用量大幅度增加。 我们从一个40MB的常驻大小的地方走到了200MB的常驻大小。
如果我们改变了事情,并创build了一个匹配必要IP地址的大型正则expression式,内存使用情况相当正常: http : //pastie.org/5110923
请记住,我们试图阻止超过3或4个IP地址…更像是50到100个,这可能包含在几个(20+)nginx服务器configuration块中。
思考? build议?
我感兴趣的是为什么内存使用量会如此巨大地使用多个块,以及是否有更好的方法来实现我们的目标。
我会build议尝试像这样的地图模块 :
map $http_x_forwarded_for $deny_access { default 0; 1.2.3.4 1; 1.2.3.5 1; 1.2.3.6 1; } if ($deny_access = 1) { return 403; }
444是一个特殊的状态码 ,它使nginx在不发送响应的情况下删除连接。 在你的情况下,这是放弃nginx和CDN之间的连接 – 然后CDN决定返回到客户端。 我会build议返回标准403(禁止)。
另一种select是使用Real IP模块将客户端IP设置为X-Forwarded-For的值,然后使用deny指令来控制访问。
但是,这将返回403(而不是使用444返回的空响应)。 它还要求Ngnix使用--with-http_realip_module http_realip_module进行编译--with-http_realip_module如果限制使用二进制分发,则可能不是一个选项。