我遇到的情况是我们有多个测试环境。每个环境都需要访问不同版本的服务,我们有一个位于这些不同服务前面的 NGINX 代理。目前我们正在使用多个服务器来进行代理。有没有办法使用 NGINX
allow
或 deny
来根据远程 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/