7

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

 2 years ago
source link: http://blog.tubumu.com/2022/03/11/nginx-server-port/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

有如下两种情况的 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

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

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 变量
正则表达式在线测试


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK