Alby's blog

世上没有巧合,只有巧合的假象。

0%

Nginx server_port 变量对批量端口反向代理的简单应用两则

一、概述

有如下两种情况的 Nginx 端口映射:一是比如将 8001-801010 个端口映射到本机的 18001-1801010HTTP/HTTPS 服务上;二是反过来,比如将 10080,18001-1801011 个端口映射到本机的 80,8001-801011HTTP/HTTPS 服务上。

当然,对于 HTTP 服务,用 iptables 也是能够实现的。但是要做同一个域名下的批量端口的 SSL 反向代理的话,最直接的方式是在 nginx.conf 中写多个 server 配置块。这样会导致 nginx.conf 的内容过多。

如果批量端口如上面描述的那样有规律可循,则可以通过 server_port 变量来简化 nginx.conf

二、小端口批量映射到大端口

8001-801010 个端口映射到本机的 18001-1801010HTTP/HTTPS 服务上。
很容易看出是在 4 位端口号基础上加 10000 ,即左侧加 1

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
# nginx 监听 8001-8010 端口
listen 8001-8010;

location / {
# 在 server_port 基础上加 10000
set $proxy_pass_port '1${server_port}';
#proxy_pass http://127.0.0.1:$proxy_pass_port$request_uri;
# 下面两行用于测试
default_type text/html;
return 200 $proxy_pass_port;
}
}

问题:如要要将 80 端口映射到 10080 的话,上述配置是无法实现的。如果少于4位的端口比较少,可以通过 if 条件进行判断再做处理。

三、大端口批量映射到小端口

10080,18001-1801011 个端口映射到本机的 80,8001-801011HTTP/HTTPS 服务上。

很容易看出是在以 1 开头的 5 位端口号基础上减 10000 ,即去掉左侧的 1 和多余的 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
# nginx 监听 10080,18001-18010 端口
listen 10080;
listen 18001-18010;

location / {
# 在 server_port 基础上减 10000
set $proxy_pass_port $server_port;
if ( $server_port ~ '^10*(\d{2,})$' ) {
set $proxy_pass_port $1;
}
#proxy_pass http://127.0.0.1:$proxy_pass_port$request_uri;
# 下面两行用于测试
default_type text/html;
return 200 $proxy_pass_port;
}
}

参考

Nginx 变量
正则表达式在线测试