写点什么

巧用 ngx_lua 做流量分组

  • 2022 年 7 月 28 日
  • 本文字数:1433 字

    阅读完需:约 5 分钟

背景

  • 测试环境并行测试:一个服务有多个需求同时进行测试,需要 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 中,直接请求原域名



...if (tag == "" or checkTag(host_pass, tag) == false)    then    return host_pass;end...
return host_pass.."_"..tag;
复制代码


set_by_lua_file $host_pass set_tag.lua;
复制代码

方式二:

请求方将 tag 拼接到域名中,nginx 收到请求后,拆分 request host,然后将 tag 添加到 header 中再转发给业务 nginx。



...local host = ngx.var.hostlocal hostList = split(host, ".")local subDomain = split(hostList[1], "-")...ngx.req.set_header("global-route-tag", subDomain[2])ngx.header["global-route-tag"] = subDomain[2]...local test_host = ipList[1].."."..hostList[2].."."..hostList[3]return test_host
复制代码


set_by_lua_file $test_host  set_test_servers.lua ;
location / { ... proxy_pass http://$host_pass; proxy_set_header Host $test_host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme;}
复制代码


采用方式一在做测试时添加 tag 到 header 不直观,接口测试时需要借助其他工具添加 tag,使用方式二可以降低操作复杂度,还可以避免办公网访问测试环境绑定 host 未生效的情况。因此我们在内部测试时更推荐方式二的配置方法。

结合 dyups 上下线带标签服务

在上期分享中,我们分享了 nginx 平滑上下线服务的过程,有同学已经注意到我们在落地实践的增量更新队列中已经支持了带 tag 的服务更新,当有 tag 的时候我们将 tag 按照一定规则拼接到 upstream 中,就可以继续平滑上下线服务了。


同学们可以复习下《转转WEB服务如何实现更平滑的变更》

实现效果

发布加标签分组,对同一个服务进行分组,发布平台在部署不同分组的时候,带上不同的标签。增加线上流量分组的功能,解决压测、灰度发布等需要流量分组的问题。


总结

对于 Nginx 粘合 Lua 来开发应用可以说是一把锋利的瑞士军刀,可以帮我们很容易的解决很多问题,最后我们总结下基于 Nginx+Lua 的常用架构模式中一些常见实践和场景:


  • WEB 应用防火墙(waf);

  • 限流;

  • 降级;

  • 服务质量监控。



关于作者

赵运周,转转运维开发,负责运维自动化工具、平台支撑。热爱思考,热爱运维。


转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。


关注公众号「转转技术」(综合性)、「大转转 FE」(专注于 FE)、「转转 QA」(专注于 QA),更多干货实践,欢迎交流分享~

用户头像

还未添加个人签名 2019.04.30 加入

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。 关注公众号「转转技术」,各种干货实践,欢迎交流分享~

评论

发布
暂无评论
巧用ngx_lua做流量分组_nginx_转转技术团队_InfoQ写作社区