proxy_pass
我需要一种通过位置 URL访问动态端口的方法。代理具有相同的 IP,但端口会发生变化,因为服务器是通过 docker 在随机端口号上创建的。(太多了,我无法手动添加)
我需要一种动态访问这些 URL 和端口的方法proxy_pass
。我在想我能否通过 URL 变量传递端口号?
例子:
location /$someport/servername/hls/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://216.189.210.65:$someport;
}
有什么办法可以做到这一点吗?
答案1
正则表达式来拯救你 ( ~
)。使用括号创建捕获组,并将第一个与 一起使用$1
。将第二个括号与$2
或更好一起使用$myuri
。我保存$2
在$myuri
和$args
中$myargs
以保留/编码可能的空格!
location ~ ^/([0-9]+)(/servername/hls/.*)$ {
set $myuri $2; # set preserves/encodes spaces!!
set $myargs $args; # set preserves/encodes spaces!!
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://216.189.210.65:$1$myuri$is_args$myargs;
}
^
是 的开头$request_uri
。+
匹配一个或多个(数字)。.
是任意字符。*
是无,一个或多个(字符)。$
是位置的结尾(查询字符串之前)。
由于 nginx 位置无法匹配问号后的查询字符串,因此必须添加$is_args$args
or better $is_args$myargs
。
我记得以前做过一些事,效果立竿见影。未经测试。
答案2
不确定 Nginx 是否会提取你的 shell 变量。
如果它在同一台服务器上运行,您仍然可以通过使用新端口号(cat,grep,sed 等)注入服务器块,然后使用新文件重新启动或重新加载 nginx 来执行此操作。
通过 bash 绝对可以做到。