如何解决NGINX可以根据IP选择proxy_pass后端吗? 当前配置我的尝试还要注意...
我有一种情况,我们有多个测试环境。每个环境都需要访问不同版本的服务,我们有一个 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。
虽然这有效,但请注意,在位置块中使用 if 可能非常棘手:http://wiki.nginx.org/IfIsEvil
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。