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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
server {
location / {
proxy_pass http://backends.example.com:8080;
}
}
server { location / { proxy_pass http://backends.example.com:8080; } }
server {
    location / {
        proxy_pass http://backends.example.com:8080;
    }
}
  1. 没有uptream配置;无法配置相关负载策略;
  2. 系统启动成功,域名解析成功后相关解析IP信息不会更新;
  3. 域名解析过程是在nginx启动时proxy_pass命令解析时完成,依赖系统DNS服务。如果解析失败, 无法启动重新加载。
  • Upstream中直接使用域名
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
upstream backends {
server backends.example.com:8080 max_fails=3;
}
server {
location / {
proxy_pass http://backends;
}
}
upstream backends { server backends.example.com:8080 max_fails=3; } server { location / { proxy_pass http://backends; } }
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结合通过变量方式
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
resolver 10.0.0.2 valid=10s;
server {
location / {
set $backend_servers backends.example.com;
proxy_pass http://$backend_servers:8080;
}
}
resolver 10.0.0.2 valid=10s; server { location / { set $backend_servers backends.example.com; proxy_pass http://$backend_servers:8080; } }
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
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
resolver 10.0.0.2 valid=10s;
upstream backends {
zone backends 64k;
server backends.example.com:8080 resolve;
}
server {
location / {
proxy_pass http://backends;
}
}
resolver 10.0.0.2 valid=10s; upstream backends { zone backends 64k; server backends.example.com:8080 resolve; } server { location / { proxy_pass http://backends; } }
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
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
http {
resolver 8.8.8.8;
upstream example {
server example.com resolve;
}
}
http { resolver 8.8.8.8; upstream example { server example.com resolve; } }
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
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
upstream backend {
dynamic_resolve fallback=stale fail_timeout=30s;
server a.com;
server b.com;
}
server {
...
location / {
proxy_pass http://backend;
}
}
upstream backend { dynamic_resolve fallback=stale fail_timeout=30s; server a.com; server b.com; } server { ... location / { proxy_pass http://backend; } }
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.