Cloud Native应用交付

  • 首页
  • 关于本站
  • 个人介绍
  • Downloads
  • Repo
    • Github
    • Container
  • F5
    • F5 Python SDK
    • F5-container
    • F5-LBaaS
  • 社交
    • 联系我
    • 微信/微博
    • 公众号
    • 打赏赞助
行至水穷处 坐看云起时
Cloud Native Application Services: cnadn.net
  1. 首页
  2. NGINX
  3. 正文

NGINX实现动态upstream的秘密

2019年10月4日 12077点热度 1人点赞 0条评论

在配置NGINX的时候,upstream,proxy_pass都是极其常用的指令,我们很多时候通过简单的搜索或者查看文档就实现了工作需求,但是这两个命令实际上有着非常多的细节,我们需要更多掌握这些细节才能更好的把控NGINX和解决工作遇到的问题,所以让我们做一些深入的研究与测试,今天此文和大家一起看看upstream下的秘密。

1.我们经常这样配置:proxy_pass http://www.example.com ,看上去一切工作ok,好了可以打游戏了。然后突然有一天你就发现,业务怎么访问不了了,为啥客户端被返回了502? 一通研究发现,是域名对应的IP发生了变化。在上述方法中,实际上仅在配置加载后利用操作系统的dns server解析一次,然后持续缓存(这里大家还可以研究下配置加载后到第一次访问之前是否有缓存),后续并不主动更新域名对应的IP,且启动或加载配置时候,如果解析不了,则无法启动。因此有很大局限性,比如在paas里用svc,云上用elb

2. 有时候我们还会这样配置,在upstream里使用域名,如下,这种方式和第一种类似,缓存解析,只有reload配置或重启时候才会更新解析,且无法解析时候会导致无法启动。但是好处是可以使用upstream里的功能参数,例如配置负载均衡算法等

1
2
3
4
5
6
7
8
9
10
upstream backends {
    least_conn;
    server backends.example.com:8080 max_fails=3;
}
 
server {
    location / {
        proxy_pass http://backends;
    }
}

3. 那怎么解决这个dns解析的缓存问题呢,是不是在配置加上resolver就能解决?比如下面这样配置是否可行?

1
2
3
4
5
6
7
resolver 10.250.0.53 valid=3s;
server {
    location /gotohelloworld {
       proxy_pass https://backends.example.com;
 
    }
}

测试结果表明这种配置并不可以。

注意:

注意本文所说的resolver指令是指的http server location上下文,upstream上下文中的resolver是1.17.5版本引入的商业指令

如在proxy_pass里使用变量,这可以帮助解决自动更新解析的问题,这样同样必须指明resolver。这种方式实际效果是每次请求都会做dns解析。同时这种方法无法配置类似第2种里的LB算法等效果。 :

1
2
3
4
5
6
7
8
resolver 8.8.8.8 valid=10s;
 
server {
    location / {
        set $servers github.com;
        proxy_pass http://$servers;
    }
}

4. 但是对于3的那种配置方法,如果upstream里需要配置很多个不同的上游域名就比较麻烦了,例如下面这个配置方法

1
2
3
4
5
    resolver 10.250.0.53 valid=3s;
    upstream apidemo2backends {
        server svc.a.com;
        server svc.b.com;
    }

在上述配置中,我们可以看到有resolver配置,但是实际中这种配置经过测试一样无法刷新DNS解析缓存,会导致nginx无法链接后端服务。

5. 那如何既能使用upstream 来定义server group实现复杂配置,同时又能满足动态实时解析更新呢。nginx plus具有这样的能力,resolve参数是nginx plus特有功能。

1
2
3
4
5
6
7
8
9
10
11
12
resolver 10.0.0.2 valid=10s;
 
upstream backends {
    zone backends 64k;
    server backends.example.com:8080 resolve;
}
 
server {
    location / {
        proxy_pass http://backends;
    }
}

6. 如果企业应用大量使用srv记录注册服务信息,例如k8s内,那么nginx plus也支持使用srv记录来发现服务配置,例如优先级,权重,端口号。 优先级可用于控制配置backup server,权重可用于lb分配

1
2
3
4
5
6
7
8
9
10
11
12
resolver 10.0.0.2 valid=10s;
 
upstream backends {
    zone backends 64k;
    server backends.example.com service=_http._tcp resolve;
}
 
server {
    location / {
        proxy_pass http://backends;
    }
}

7. 最后一种动态更新后端的方法就是使用nginx plus的api来直接动态修改,这个方法比较直接,非常适合自动化变更与部署,或者通过企业的devops pipeline来纳入,当upstream发生变化时,直接自动调用相关API进行变更配置,也非常适合在公有云上和scale group配合。

 

https://www.nginx.com/blog/dns-service-discovery-nginx-plus/
https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/

相关文章

  • Better Alignment:多可用区双层负载下,如何借助F5避免局部NGINX后业务实例过载
  • NGINX Plus运行lua-resty-core Lua库
  • [记录]nginx etag在proxy下的一些行为
  • 欢迎参加F5 NGINX Sprint China 2022
  • 企业开源分析和思考
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: DNS nginx nginx plus resolver srv upstream 动态upstream
最后更新:2021年12月19日

纳米

linjing.io

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

页面AI聊天助手

纳米

linjing.io

☁️迈向Cloud Native ADC ☁️

认证获得:
TOGAF: ID 152743
Kubernetes: CKA #664
Microsoft: MCSE MCDBA
Cisco: CCNP
Juniper: JNCIS
F5:
F5 Certified Solution Expert, Security
F5 Certified Technology Specialist, LTM/GTM/APM/ASM
F5 Certified BIG-IP Administrator
  • 点击查看本博技术要素列表
  • 归档
    分类
    • AI
    • Automation
    • Avi Networks
    • Cisco ACI
    • CISCO资源
    • F5 with ELK
    • F5-Tech tips
    • F5技术
    • Juniper
    • Linux
    • NGINX
    • SDN
    • ServiceMesh
    • WEB编程
    • WINDOWS相关
    • 业界文章
    • 交换机技术
    • 化云为雨/Openstack
    • 协议原理
    • 容器/k8s
    • 我的工作
    • 我的生活
    • 网站技术
    • 路由器技术
    • 项目案例
    标签聚合
    irule docker network F5 envoy bigip openstack flannel api nginx neutron k8s gtm DNS istio
    最近评论
    汤姆 发布于 8 个月前(09月10日) 嗨,楼主,里面的json怎么下载啊,怎么收费啊?
    汤姆 发布于 8 个月前(09月09日) 大佬,kib的页面可以分享下吗?谢谢
    zhangsha 发布于 1 年前(05月12日) 资料发给我下,谢谢纳米同志!!!!lyx895@qq.com
    李成才 发布于 1 年前(01月02日) 麻烦了,谢谢大佬
    纳米 发布于 1 年前(01月02日) 你好。是的,因为以前下载系统插件在一次升级后将所有的下载生成信息全弄丢了。所以不少文件无法下载。DN...
    浏览次数
    • Downloads - 183,789 views
    • 联系我 - 118,966 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 116,677 views
    • Github - 103,713 views
    • F5常见log日志解释 - 79,786 views
    • 从传统ADC迈向CLOUD NATIVE ADC - 下载 - 74,648 views
    • Sniffer Pro 4 70 530抓包软件 中文版+视频教程 - 74,320 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 67,770 views
    • 关于本站 - 60,941 views
    • 这篇文档您是否感兴趣 - 55,514 views
    链接表
    • F5SE创新
    • Jimmy Song‘s Blog
    • SDNlab
    • Service Mesh社区
    • 三斗室
    • 个人profile
    • 云原生社区

    COPYRIGHT © 2023 Cloud Native 应用交付. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    京ICP备14048088号-1

    京公网安备 11010502041506号