NGINX 可以根据 IP 选择 proxy_pass 后端吗?

Can NGINX choose proxy_pass backend based on IP?

我的情况是我们有多个测试环境。每个环境都需要访问不同版本的服务,我们有一个 NGINX 代理位于这些不同服务的前面。目前我们正在使用多个服务器来做代理。有没有一种方法可以使用 NGINX allowdeny 根据远程 IP 过滤环境连接到哪个后端?

v1 环境在 10.0.1.0/24 范围内有 IP 个地址,并且 v2 仅通过 10.0.2.0/24 中的 IP 连接。

当前配置

为简洁起见进行了简化。

server {
  listen 80;
  server_name service.v1.net;
  proxy_pass http://10.0.10.56:8081;
}
server {
  listen 80;
  server_name service.v2.net;
  proxy_pass http://10.0.10.56:8082;
}

我试过的

显然这行不通。

server {
  listen 80;
  server_name service.net;

  location / {
    # v1 proxy
    allow 10.0.1.0/24;
    deny all;
    proxy_pass http://10.0.10.56:8081;
  }

  location / {
    # v2 proxy
    allow 10.0.2.0/24;
    deny all;
    proxy_pass http://10.0.10.56:8082;
  }

}

另请注意...

我知道这可以通过在不同端口和 iptables 规则上提供代理来完成 - 我正在尝试弄清楚 NGINX 是否可以自己完成。

您可以使用 ngx_http_geo_module。 (开箱即用)。它根据客户端 IP 地址设置变量,然后可以在 if 中使用。

geo $environment {
  10.0.1.0/24 v1;
  10.0.2.0/24 v2;
}

server {
  listen 80;
  server_name service.net;

  location / {
    if ($environment = v1) {
      proxy_pass http://10.0.10.56:8081;
    }

    if ($environment = v2) {
      proxy_pass http://10.0.10.56:8082;
    }
  }
}

在这种情况下,所有其他 IP 都会看到 404。

虽然这可行,但请注意,在位置块中使用 if 可能非常棘手:http://wiki.nginx.org/IfIsEvil