# nginx realserver 使用域名方式功能分析
Date: 2023-07-27


nginx使用域名方式访问RS的一些方案整理：

- ##### **proxy\_pass 直接放域名无upstream**
    

```
server {
    location / {
        proxy_pass http://backends.example.com:8080;
    }
}

```

1. 没有uptream配置；无法配置相关负载策略；
2. 系统启动成功，域名解析成功后相关解析IP信息不会更新；
3. 域名解析过程是在nginx启动时proxy\_pass命令解析时完成，依赖系统DNS服务。如果解析失败， 无法启动重新加载。

- ##### **Upstream中直接使用域名**
    

```
upstream backends {
      server backends.example.com:8080 max_fails=3;
}
server {
    location / {
        proxy_pass http://backends;
    }
}

```

1. 域名解析过程是在nginx启动时upstream server命令解析时完成, IP列表保存；
2. 系统启动成功，域名解析成功后相关解析IP列表信息不会更新；
3. 依赖系统DNS服务。如果解析失败， 无法启动重新加载；

- ##### **proxy\_pass结合通过变量方式**
    

```
resolver 10.0.0.2 valid=10s;

server {
    location / {
        set $backend_servers backends.example.com;
        proxy_pass http://$backend_servers:8080;
    }
}

```

1. 使用resolver命令设置的域名服务器，通过valid设置DNS信息有效时间；
2. 解析失败不影响nginx服务启动。

##### **开源版本总结：**

1. Nginx配置中使用域名只有在nginx启动时完成地址解析， 获取DNS解析后的地址列表。
2. Nginx开源版本中可以通过proxy\_pass ， server（upstream）配置命令中使用域名均命令nginx启动的命令解析阶段进行，解析错误将导致无法启动、无法重新加载。
3. Proxy\_pass + resovle解决了这个问题，但是不使用upstream无法实现现有的多server配置。

 

**其他解决方案**

- ##### **Nginx plus**
    

```
resolver 10.0.0.2 valid=10s;

upstream backends {
    zone backends 64k;
    server backends.example.com:8080 resolve;
}

server {
    location / {
        proxy_pass http://backends;
    }
}

```

1. 商业版本支持在现有的server命中增加 resolve参数支持的域名解析
2. 可以通过zone 指令共享配置。

[Dynamic Configuration of Upstreams with the NGINX Plus API | NGINX Plus](https://docs.nginx.com/nginx/admin-guide/load-balancer/dynamic-configuration-api/)

- ##### **nginx-upstream-dynamic-servers**
    

```
http {
  resolver 8.8.8.8;

  upstream example {
    server example.com resolve;
  }
}

```

功能类似nginx plus 但是时间比较老，只支持1.9以前版本。

[GitHub - GUI/nginx-upstream-dynamic-servers: An nginx module to resolve domain names inside upstreams and keep them up to date.](https://github.com/GUI/nginx-upstream-dynamic-servers)

 

- ##### **ngx\_http\_upstream\_dynamic\_module-Tengine**
    

```
upstream backend {
    dynamic_resolve fallback=stale fail_timeout=30s;
    server a.com;
    server b.com;
}
server {
    ...
    location / {
        proxy_pass http://backend;
    }
}

```

支持域名解析定期更新， 由于没有修改server启动和重载时如果域名解析失败，会导致start reload失败。

[ngx\_http\_upstream\_dynamic\_module - The Tengine Web Server (taobao.org)](http://tengine.taobao.org/document/http_upstream_dynamic.html)

 

图片from[陳丁光](https://www.facebook.com/groups/474930279315210/user/100010173011046/?__cft__[0]=AZW7JZCscR8DRZRkvyIz83cSqwxaXbVOX2oxxLt-SF0z5v_bf7MIUaITBiCozHgCPaj4RXMDgphbJa4q-iDW3KBA6D0S_RxlS7G4cwNPLx7I4d2eCdqJxvGun_-PxmjWb5X-7culZPLrsd229fldnj5NnxIqKMf_LxVjKssJsAY0VPKQ_B-9s5B-7qWVq0fy048&__tn__=-UC*F)

