nginx realserver 使用域名方式功能分析

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

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

  • 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.

 

  • 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)

 

图片from陳丁光

 

Comments are closed.