NGINX 动态端口 proxy_pass

NGINX 动态端口 proxy_pass

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$argsor better $is_args$myargs

我记得以前做过一些事,效果立竿见影。未经测试。

答案2

不确定 Nginx 是否会提取你的 shell 变量。

如果它在同一台服务器上运行,您仍然可以通过使用新端口号(cat,grep,sed 等)注入服务器块,然后使用新文件重新启动或重新加载 nginx 来执行此操作。

通过 bash 绝对可以做到。

相关内容