nginx使用域名方式访问RS的一些方案整理:
-
proxy_pass 直接放域名无upstream
server { location / { proxy_pass http://backends.example.com:8080; } }
- 没有uptream配置;无法配置相关负载策略;
- 系统启动成功,域名解析成功后相关解析IP信息不会更新;
- 域名解析过程是在nginx启动时proxy_pass命令解析时完成,依赖系统DNS服务。如果解析失败, 无法启动重新加载。
-
Upstream中直接使用域名
upstream backends { server backends.example.com:8080 max_fails=3; } server { location / { proxy_pass http://backends; } }
- 域名解析过程是在nginx启动时upstream server命令解析时完成, IP列表保存;
- 系统启动成功,域名解析成功后相关解析IP列表信息不会更新;
- 依赖系统DNS服务。如果解析失败, 无法启动重新加载;
-
proxy_pass结合通过变量方式
resolver 10.0.0.2 valid=10s; server { location / { set $backend_servers backends.example.com; proxy_pass http://$backend_servers:8080; } }
- 使用resolver命令设置的域名服务器,通过valid设置DNS信息有效时间;
- 解析失败不影响nginx服务启动。
开源版本总结:
- Nginx配置中使用域名只有在nginx启动时完成地址解析, 获取DNS解析后的地址列表。
- Nginx开源版本中可以通过proxy_pass , server(upstream)配置命令中使用域名均命令nginx启动的命令解析阶段进行,解析错误将导致无法启动、无法重新加载。
- 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; } }
- 商业版本支持在现有的server命中增加 resolve参数支持的域名解析
- 可以通过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以前版本。
-
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.