我希望有人能帮助我解决以下问题。我正在尝试设置反向代理,以便使用nginx
tcp/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)
。