巧用 ngx_lua 做流量分组
背景
测试环境并行测试:一个服务有多个需求同时进行测试,需要 nginx 根据特定信息将流量转发到指定测试机。
全链路压测:流量无区分,影响线上用户,只能在业务低峰进行压测,需要值守,成本较高,需要能够流量隔离,随时可以进行压测。
灰度发布:需要 nginx 根据指定信息将流量转发到指定的灰度机器上。
ngx_lua 模块
ngx_lua 是 Nginx 的一个模块,将 Lua 嵌入到 Nginx 中,从而可以使用 Lua 来编写脚本,这样就可以使用 Lua 编写应用脚本,部署到 Nginx 中运行,即 Nginx 变成了一个 Web 容器;这样开发人员就可以使用 Lua 语言开发高性能 Web 应用了。
ngx_lua 提供了与 Nginx 交互的很多的 API,对于开发人员来说只需要学习这些 API 就可以进行功能开发.
ngx_lua 运行指令
ngx_lua 属于 nginx 的一部分,它的执行指令都包含在 nginx 的 11 个步骤之中了,相应的处理阶段可以做插入式处理,即可插拔式架构,不过 ngx_lua 并不是所有阶段都会运行的;另外指令可以在 http、server、server if、location、location if 几个范围进行配置:
设置流量标签
方式一:
请求方将 tag 添加到 header 中,直接请求原域名
方式二:
请求方将 tag 拼接到域名中,nginx 收到请求后,拆分 request host,然后将 tag 添加到 header 中再转发给业务 nginx。
采用方式一在做测试时添加 tag 到 header 不直观,接口测试时需要借助其他工具添加 tag,使用方式二可以降低操作复杂度,还可以避免办公网访问测试环境绑定 host 未生效的情况。因此我们在内部测试时更推荐方式二的配置方法。
结合 dyups 上下线带标签服务
在上期分享中,我们分享了 nginx 平滑上下线服务的过程,有同学已经注意到我们在落地实践的增量更新队列中已经支持了带 tag 的服务更新,当有 tag 的时候我们将 tag 按照一定规则拼接到 upstream 中,就可以继续平滑上下线服务了。
同学们可以复习下《转转WEB服务如何实现更平滑的变更》
实现效果
发布加标签分组,对同一个服务进行分组,发布平台在部署不同分组的时候,带上不同的标签。增加线上流量分组的功能,解决压测、灰度发布等需要流量分组的问题。
总结
对于 Nginx 粘合 Lua 来开发应用可以说是一把锋利的瑞士军刀,可以帮我们很容易的解决很多问题,最后我们总结下基于 Nginx+Lua 的常用架构模式中一些常见实践和场景:
WEB 应用防火墙(waf);
限流;
降级;
服务质量监控。
关于作者
赵运周,转转运维开发,负责运维自动化工具、平台支撑。热爱思考,热爱运维。
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转 FE」(专注于 FE)、「转转 QA」(专注于 QA),更多干货实践,欢迎交流分享~
评论