我有多个 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;
}
这里使用正则表达式捕获将端口号的后半部分捕获到变量中,然后在目标字符串中使用该变量。
我自己还没有测试过,但它应该可行。
首先,您需要map
在http
级别中定义一个,将端口号映射到代理端点:
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 将请求发送到所需的目的地。