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

标签 nginx reverse-proxy

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

v1环境的IP地址在10.0.1.0/24范围内,而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。

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

关于nginx - NGINX可以根据IP选择proxy_pass后端吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67181573/

相关文章:

Apache 反向代理配置 - 子域

Docker-compose 与 nginx 反向、一个网站和一个 Restful api?

Azure Functions 代理 - 路由到存储帐户

docker - 如何在 Apache httpd 后面公开 Docker-Registry?

php - Drupal 8 + Nginx 反向代理作为子目录

shell - 在 shell 中打印多行 - 提高配置 Vagrantfile 时的可读性

docker - 使用 nginx、kubernetes 和 docker 服务 Assets

apache2 - 使用 websocket mod_proxy_wstunnel 进行反向代理

python - 如何使用 django 在 nginx 中以 root 身份提供子目录?

docker - Nginx 代理上游服务器 Docker Compose - 502 Bad Gateway Connection Refused