导航菜单
路很长,又很短
博主信息
昵   称:Cocodroid ->关于我
Q     Q:2531075716
博文数:356
阅读量:1648307
访问量:205648
至今:
×
云标签 标签球>>
云标签 - Su的技术博客
Tags : nginx,动态配置发表时间: 2021-11-12 01:14:39

直日神 八戒技术团队


关于Nginx

Nginx(engine X)是一款开源的Web服务器软件,因其具有性能稳定、高并发、低内存耗用、高性能的处理能力等特点而闻名。该软件由Igor Sysoev创建并于2004年首次公开发布,Nginx实现了Web服务器的基本功能,用户通过简单的配置指令就能快速完成Web服务器的搭建,它还是一款四七层负载均衡代理软件,支持TCP/UDP、FastCGI、uwsgi、 SCGI、gRPC等协议,并且支持很多第三方的模块扩展。


01

约十年前,猪八戒Nginx的使用

在2011年初的时候,猪八戒网就已经开始使用Nginx了,我们使用Nginx的场景也特别简单,
仅仅只是用于HTTP/HTTPS协议的反向代理转发,我记得当时的Nginx运行版本是0.8.x,
还不支持TCP/UDP、WebSocket、gRPC等协议。那时我们的服务器都是物理机,扳起手指都能数过来,
而且就只有测试环境与生产环境,几乎都是通过手动进行运维,所以都是在服务器上直接进行Nginx配置操作。
 
那时的Nginx架构很简单,如下图:
图片
 
测试环境Nginx配置:
图片
 
生产环境Nginx配置:
图片
 

02

约五年前,猪八戒Nginx的使用

但随着业务访问量的直线增长,猪八戒网的应用、研发人员都出现了很大规模的增长。
伴随着很多问题也出现了,从单(机房)数据中心变为多(机房)数据中心,
2个环境变为多个环境(最多高达20个+),原来运行在物理机上的应用也迁移到虚拟机或容器上,
如果还按照原来的手工模式维护几十个NginxConf配置,将导致环境差异性、Nginx配置不可移植、
操作繁琐且容易出错、而且维护成本高。
 
那时每个数据中心每个环境都有独立的nginx配置,如下图:
图片

03

开始探索自动适配多数据中心多环境多版本的Nginx配置

针对以上情况的问题,我们该怎么实现一份Nginx配置如何能够自动适配多数据中心多环境多版本? 
下图是我们想要的实现的效果。
图片
 

其实Nginx官方有种解决方案是将DNS用于NGINX的服务发现,但是缺失Upstream的管理,我们就放弃这个方案了。如下图

图片

经过我们多次测试,发现仅仅通过Nginx配置是无法实现这个需求的,要么自己开发Nginx模块来实现,但是需要用C语言开发,而且用C语言开发模块必须要熟悉Nginx的源代码,使得我们对其望而生畏。于是在google搜索有没有符合我们需求的开源的第三方nginx模块,经过半天的时间调研,终于找到了一款ngx_lua模块符合我们的需求。


什么是ngx_lua?

ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,采用lua脚本实现业务逻辑,由于lua的紧凑、快速以及内建协程,所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。 

 
实现方式:
1、定义“数据中心”、“环境”、“版本”三个环境系统变量,变量名暂定为:DC、DC_ENV、DC_VER
· DC表示这台系统所在的(北京廊坊、天津华苑)数据中心;
· DC_ENV表示这台系统所处的(开发、测试、预发布、生产等)环境;
· DC_VER表示这台系统代理的应用版本(默认为latest);
 
2、Nginx Server配置将测试域名、正式域名与应用进行关联,应用名变量暂定$target。
· 测试域名为什么是正则匹配?因为运行环境特别多,测试域名都不一样,
例:www.t1.zbjtest.com  www.test.zbjtest.com
图片
 
3、制定应用关联Upstream的命名规范,我们协定以“应用名+数据中心+环境+版本”进行命名。
· Upstream:www_bjlf_test_latest表示应用“www”运行在北京廊坊测试环境的最新版本;
· Upstream:www_bjlf_prod_latest表示应用“www”运行在北京廊坊生产环境的最新版本;
· Upstream:www_bjlf_prod_v2表示应用“www”运行在北京廊坊测试环境的v2版本;
 
4、配置nginx.conf,加载“DC”、“DC_ENV”、“DC_VER”系统变量,定义加载Lua代码路径
图片
 
5、当nginx启动的时候,init_by_lua_file阶段会将DC、DC_ENV、DC_VER加载到Lua内存中
图片
6、当用户请求www.zbj.com的时候,执行rewrite_by_lua_file阶段将根据target、DC、
DC_ENV、DC_VER封装应用的Upstream名称,这样就能代理转发了。
· 关于Upstream是如何注册到nginx中,我们是基于consul + ngx_http_dyups_module来实现的。
图片
 

这样一份nginx配置就能适配多个数据中心多个环境多个版本了,这样大大降低Nginx冗余配置,并保证环境一致性。


  

本文主要阐述如何利用ngx_lua的init_by_lua_file与rewrite_by_lua_file阶段来简单实现Nginx配置适配多数据中心多环境多版本的功能还能用ngx_lua实现waf、灰度发布、服务发现、动态限速等功能,关于ngx_lua的更多特性,可以参考官方文档。

下期预告

nginx的动态配置分享到此,关于Upstream是如何注册到nginx中,我们是基于consul + ngx_http_dyups_module来实现的,下期为大家分享nginx服务发现,欢迎继续关注~




...阅读原文
推荐文章