NGINX TCP 负载平衡“if”指令在“stream”上下文中不允许使用

NGINX TCP 负载平衡“if”指令在“stream”上下文中不允许使用

我希望有人能帮助我解决以下问题。我正在尝试设置反向代理,以便使用nginxtcp/udp 进行负载平衡。

我希望能够根据连接到代理服务器的客户端 IP 地址重定向一些流量。为此,我使用内置的 nginx 变量$remote_addr

我使用的nginx版本是:nginx/1.10.3 (Ubuntu)

我收到的错误信息是:nginx: [emerg] "if" directive is not allowed here

这是我的配置文件,如下所示:

user www-data;
worker_processes auto;
pid /run/nginx/pid

events {
    worker_connections 768;
}

stream {
    upstream prod_backend {
        server 192.168.137.129:23;
    }
    upstream test_backend {
        server 192.168.137.131:23;
    }

    server {
        listen 23;

        if ( $remote_addr = 192.168.137.132 ) {
            proxy_pass test_backend;
        }

        proxy_pass prod_backend;
    }
}

http {
}

看到这个答案后这里,我尝试使用 Geo 模块但遇到了同样的问题。

user www-data;
worker_processes auto;
pid /run/nginx/pid

events {
    worker_connections 768;
}

stream {
    upstream prod_backend {
        server 192.168.137.129:23;
    }
    upstream test_backend {
        server 192.168.137.131:23;
    }

    geo $test_site {
        default 0;
        192.168.137.132 1;
    }

    server {
        listen 23;

        if ( $test_site ) {
            proxy_pass test_backend;
        }

        proxy_pass prod_backend;
    }
}

http {
}

当我运行上述版本时出现错误:

nginx: [emerg] "geo" directive is not allowed here

我显然做错了什么但不知道是什么!

答案1

正如用户@Alex_hha 指出的那样,“if”指令只能在指令内使用http

经过对这一领域的一些研究,我现在找到了解决问题的方法。

如果你正在使用stream通用流量指令,则可以使用TCP/UDP该语句的替代方法是if地图功能

使用此方法我的配置文件现在如下所示:

stream {
   upstream prod_backend {
      server 192.168.137.129:23;
   }

   upstream test_backend {
      server 192.168.137.131:23;
   }

   map $remote_addr $backend_svr {
      192.168.137.140:23 "test_backend";
      default "prod_backend";
   }

   server {
      listen 23;
      proxy pass $backend_svr;
   }
}

在这个例子中,如果客户端连接它IP的地址,192.168.137.140它将被发送到test_backend上游块。

我使用的nginx版本是:nginx/1.12.1 (Ubuntu)

相关内容