Nginx proxy_pass反向代理动态端口

背景

某项目需要播放第三方监控视频,我方访问域名假定为 my.area.com,第三方的域名假定为 video.other.com,域名不一致就导致浏览器跨域问题无法播放,且第三方拖拖拉拉不想解决,于是只有我方使用 nginx 做反向代理来解决跨域问题。

但是在代理的过程中发现,对方返回的播放端口有N多个且有变更的风险,所以使用 nginx 穷举端口式的代理不是第一选择,就想着 proxy_pass 能不能配置出动态端口进行代理呢,这样我方只需要一次配置就能解决问题。

解决

1、后台程序从第三方平台获取到对方的播放地址后,替换域名、处理端口为访问路径

例如:https://video.other.com:8080/play/id?token=123
处理为:https://my.area.com/8080/play/id?token=123

2、Nginx 代理配置

http {

  server {
    listen 80;
    server_name localhost;

    # 正则匹配请求路径:https://my.area.com/8080/play/id?token=123
    location ~ /(\d+)/play/(.*?)$ {
      # 域名间的代理且使用了参数,就需要配置 DNS 服务器来解析域名
      resolver 114.114.114.114;
      # 取正则匹配上的路径作为端口,实现动态端口的功能
      proxy_pass https://video.other.com:$1/play/$2?$args
    }
  }

}

如此配置变实现了业务动态端口的代理。

详细说明:

  • $1、$2 等代表什么?

$ 代表使用内置参数,在正则匹配中,代表正则组索引,在这里,$1 就代表了 8080,$2 就代表 id

  • location 的匹配为什么要 /(\d+)/play/(.*?)$ 这样配置,配置成 /(\d+)/play/ 不可以么?

proxy_pass 一旦使用了参数,那么就不会对请求地址拼接,而是替换参数操作了,如果配置为 /(\d+)/play/ 将会丢失后面的请求路径,最终代理后的访问路径为:https://video.other.com:8080/play/

  • proxy_pass 为什么要在末尾添加 ?$args 配置?

$args 是 nginx 的内置参数,代表了 GET 请求参数,因为不是地址拼接,所以参数也会丢失,需要手动添加。

另:代理了业务动态端口的功能后,建议使用后台程序来测试功能,用于输出完整访问地址和参数,才能知道配置如何调整。

你可能感兴趣的:(nginx,运维)