我们需要用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 的常驻大小。
如果我们改变一下,并创建一个匹配必要 IP 地址的大型正则表达式,内存使用是相当正常的:http : //pastie.org/5110923
请记住,我们正在尝试阻止超过 3 或 4 个 IP 地址……更像是 50 到 100 个,它们可能包含在几个(20+)个 nginx 服务器配置块中。
想法?建议?
我对为什么使用多个 if 块会导致内存使用量激增如此之大感兴趣,以及是否有更好的方法来实现我们的目标。
我建议尝试使用这样的地图模块:
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;
}
Run Code Online (Sandbox Code Playgroud)
444 是一个特殊的状态代码,它会导致 nginx 断开连接而不发送响应。在您的情况下,这会断开 nginx 和 CDN 之间的连接——然后 CDN 决定返回给客户端的内容。我建议返回标准 403(禁止)。
归档时间: |
|
查看次数: |
1190 次 |
最近记录: |