使用lua脚本在nginx上进行灰度流量转发
参考资料
从请求中获取值
-- 从请求中获取请求头为 Sec-WebSocket-Protocol 的值
secWebSocketProtocol=ngx.req.get_headers()["Sec-WebSocket-Protocol"]
-- 从 cookie 中获取uid对应的值
uid=ngx.var.cookie_uid
-- 获取我们在 nginx 中定义的变量
-- set $lct "initialD";
location=ngx.var.lct
-- 从请求头中获取来源 ip
ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr
说明
推送到 nginx 中的 json 配置数据
[
{
"rules": {
"rule_name": {
"rule": [
{
"type": "cookie",
"key": "test",
"value": "",
"multi_val": [
"1"
],
"match_type_v": "whitelist",
"relative": "must"
}
],
"should_match_num": 0,
"relative": "must"
},
"should_match_num": 0
},
"task_info": {
"host": "storage.test.com",
"group_code": "1572094195",
"location": "test",
"project_type": "1"
}
}
]
test.conf 文件的内容
upstream test_default {
server 172.16.1.1:20440;
server 172.16.1.2:20440;
}
server{
listen 80;
server_name storage.test.com;
charset utf-8;
location / {
index index.html index.htm;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 500m;
client_body_buffer_size 256k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 600;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
set $lct "test";
set_by_lua_file $cur_ups conf/vhost/lua/grayscaleControl.lua;
proxy_pass $scheme://$cur_ups;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
access_log logs/test_access.log json;
error_log logs/test_error.log info;
}
用户配置的HTTP规则生效流程
- 用户配置拦截的条件
- 根据条件生成规则的json数据
- 一个项目有一个json规则数据,将项目的json数据放入列表
- 将列表数据以json的方式写出到文件,文件名为 whitelistCustomizeConfig.json
- 将文件推送到nginx下
- 重启nginx,此时会重新加载json规则数据到 nginx 内存中
nginx 重启流程
- lua_shared_dict whitelist_customize 64m(在 nginx 中开辟一个空间,用于加载拦截请求的规则)
- init_worker_by_lua_file conf/vhost/lua/init.lua (执行 lua 脚本,读取whitelistCustomizeConfig.json 文件,将规则数据按照项目保存到 whitelist_customize 字典中,字典中的 key 是 “域名 + 项目名”, 字典中的 value 是用户配置的 json 规则数据)
浏览器发起请求进行拦截的过程
- 根据请求获取域名和项目名
- 从 nginx 内存中获取规则,即根据 key="域名+项目名" ,获取 map 中的值
- 执行 lua 脚本,根据从内存中获取的规则进行判断,将请求转发到正常节点的 upstream 或者是 灰度节点的 upstream

代码地址
https://github.com/daleyzou/NginxWithLua
使用lua脚本在nginx上进行灰度流量转发的更多相关文章
- 通过nginx + lua来统计nginx上的监控网络请求和性能
介绍 以前我们为nginx做统计,都是通过对日志的分析来完成.比较麻烦,现在基于ngx_lua插件,开发了实时统计站点状态的脚本,解放生产力. 项目主页: https://github.com/sky ...
- Nginx 反向代理,流量转发到固定内网 IP 方法
主配置文件: user nginx; worker_processes ; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pi ...
- 快速入门Redis调用Lua脚本及使用场景介绍
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...
- spring boot:用redis+lua实现基于ip地址的分布式流量限制(限流/简单计数器算法)(spring boot 2.2.0)
一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处 ...
- iperf测试流量转发(nginx反向代理tcp/udp)
一.准备工作 服务器1:192.168.33.102 搭建nginx服务,作为反向代理的中转站 服务器2:192.168.33.103 nginx要反向代理的服务器 服务器3:192.1 ...
- Nginx 内嵌lua脚本,结合Redis使用
0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...
- 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...
- 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x0n 前言 ...
- 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)
一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...
随机推荐
- CF-Technocup3 D Optimal Subsequences
D Optimal Subsequences http://codeforces.com/contest/1227/problem/D2 显然,每次求的k一定是这个序列从大到小排序后前k大的元素. 考 ...
- poj 1095 题解(卡特兰数+递归
题目 题意:给出一个二叉树的编号,问形态. 编号依据 1:如果二叉树为空,则编号为0: 2:如果二叉树只有一个节点,则编号为1: 3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编 ...
- Delphi 10 Seattle plus 新特性——System.JSON.Builders
{ 全能中间件 —— 简单.高效.稳定.安全的三层中间件 1.支持 多账套多数据库,包括SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL ...
- DSP未来五大发展趋势
在4G无线通信领域,数据吞吐量已经达到了3G时代的100到1000倍;在多媒体处理器领域,每天都有新的标准涌现出来;在更多其它DSP应用领域,密集的数据处理器需求不断给处理器设计团队带来新的挑战.随着 ...
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...
- js调用浏览器复制
<script type="text/javascript"> function copyUrl2() { var Url2=document.getElementBy ...
- 14-3 SQL Server基本操作
SQL Server安装默认新建四个系统数据库 1.master数据库 Master数据库时SQL Server中最重要的数据库.它记录SQL Server实例的所有系统级信息,包括实例范围的元数据. ...
- Java中 StringBuffer StringBuilder String 区别
String 字符串常量 不可变 使用字符串拼接时是不同的2个空间 StringBuffer 字符串变量 可变 线程安全 字符串拼接直接在字符串后追加 StringBui ...
- DevExtreme学习笔记(一) DataGrid中数据提交注意事项
1.数据提交的{}数据需转化json格式 syncPost('/controller/action', { values: JSON.stringify({d:x}) }, function (res ...
- ABP 基于DDD的.NET开发框架 学习(六)创建新动态Api
我们想要这个服务暴露成一个Web API控制器,以方便客户端调用.ASP.NET Boilerplate能够自动且动态地为这个应用服务创建Web API 控制器,只需要一行配置代码即可完成. Dyna ...