Nginx根据端口号重定向到不同的IP

Nginx根据端口号重定向到不同的IP

我有多个 HTTP 服务器(IoT 设备)通过 Nginx 实例连接到 Raspberry Pi。我想使用 Nginx 的 IP 地址和多个端口代理对这些服务器的访问:

192.168.1.100:8080 -> 192.168.2.80
192.168.1.100:8081 -> 192.168.2.81
...

我在 Nginx 中有这个配置可以工作:

server {
    listen  8080;
    location / {
        proxy_pass http://192.168.2.80;
        ..... extra config
    }
}

但是,我不想为每个可能的地址编写单独的配置条目,因为可能有很多地址,而且我必须为每个地址添加一些我不想重复的额外配置设置。我知道我可以在同一服务器配置中添加多个监听端口,但是有没有办法提取端口号并使用它来重写 proxy_pass 地址?

答案1

编辑:

自动端口 -> IP 地址映射可能像这样工作:

map $server_port $upstream {
    "~^80(?<dest>[0-9+])$"   192.168.2.$dest;
}

这里使用正则表达式捕获将端口号的后半部分捕获到变量中,然后在目标字符串中使用该变量。


我自己还没有测试过,但它应该可行。

首先,您需要maphttp级别中定义一个,将端口号映射到代理端点:

map $server_port $upstream {
    8080     192.168.2.80;
    8081     192.168.2.81;
    8082     192.168.2.82;
    ...
}

您可能需要default在地图上添加一条线。

然后,在server级别中添加以下内容:

listen 8080;
listen 8081;
listen 8082;

location / {
    proxy_pass http://$upstream;
}

此设置使单个server块监听多个端口,并且当使用映射变量作为proxy_pass目的地时,它将使 nginx 将请求发送到所需的目的地。

相关内容