Nginx 多个 if 语句导致内存使用跳转

Jus*_*sza 5 nginx

我们需要用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 块会导致内存使用量激增如此之大感兴趣,以及是否有更好的方法来实现我们的目标。

mgo*_*ven 5

我建议尝试使用这样的地图模块:

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(禁止)。