NGINX 可以根据 IP 选择 proxy_pass 后端吗?
Can NGINX choose proxy_pass backend based on IP?
我的情况是我们有多个测试环境。每个环境都需要访问不同版本的服务,我们有一个 NGINX
代理位于这些不同服务的前面。目前我们正在使用多个服务器来做代理。有没有一种方法可以使用 NGINX
allow
或 deny
根据远程 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
我的情况是我们有多个测试环境。每个环境都需要访问不同版本的服务,我们有一个 NGINX
代理位于这些不同服务的前面。目前我们正在使用多个服务器来做代理。有没有一种方法可以使用 NGINX
allow
或 deny
根据远程 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