upstream_使用域名配置上游服务

By 赵延刚 2023-08-14

利用 OpenNJet 实现动态 upstream 域名解析

在使用 NGINX 做负载均衡进行反向代理的场景中,使用 upstream 管理一组有效的上游服务器地址。 地址可以包含两类:server ip 和 server name。

其中 server name 在 nginx 启动时,必须统一解析为 server ip,在整个运行过程中,upstream 中只包含解析后的 server ip,并且数量,以及 ip 是不会改变的,即使 dns 服务器上相应的 server name 对应的 ip 地址列表,已经进行了更新,删除,添加。Nginx 也不会进行动态更新,如果要更新,只能重新 reload nginx。

启动 nginx 前:

upstream backend {
    server backend1.example.com;
    server 127.0.0.1:888;
    }

启动 nginx 后:

upstream backend {
    server 192.168.40.139;
    server 127.0.0.1:888;
    }

问题

  1. 运行过程中,如果域名对应的某个 IP 的机器或服务出现故障,无法进行动态隔离,必须修改 DNS 服务器上 Server Name 对应的 IP 列表,并重新 Reload NGINX,导致业务中断。
  2. 运行过程中,如果在 DNS 服务器上,对 server name 对应的 IP 进行,修改,添加,删除,也无法及时的反应到 NGINX 上来,也必须重新 Reload NGINX。

OpenNJet 解决方案

upstream backend {
    resolver  192.168.40.1  valid=10s; //valid失效时间。
    server backend1.example.com resolve;//resolve 指明需动态更新
    server 127.0.0.1:888;
    }

在 upstream 里配置 resolver 指定 dns 服务器地址,以及域名失效时间 valid=10s, 也就是每隔 10 秒钟,重新请求 dns 进行域名解析。域名解析对应的 IP 列表的变化,添加,删除,修改等会及时的同步到 upstream 中,这样就可以通过修改 dns 服务器上对应 server name 的 ip 列表,对服务的 IP 进行动态调整。

OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,随着 NGINX 版本迭代,吸收上游 NGINX 的更新,已经同步更新到 NGINX1.23.1 版本,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。

作为底层引擎,OpenNJet 利用动态加载机制可以实现不同的产品形态,如 API 网关、消息代理、出入向代理,负载均衡,WAF 等等。在云原生架构中,OpenNJet 除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信、透明流量劫持、熔断、遥测与故障注入等新功能特性。

传送门:https://gitee.com/njet-rd