「技术分享」猪八戒网十年Ngnix动态配置探索之路

查看原文关注“八戒技术团队”,阅读更多技术干货

查看原文:【技术分享】猪八戒网十年Ngnix动态配置探索之路

关于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的更多特性,可以参考官方文档。

原文链接:,转发请注明来源!