Nginx集成Lua实现根据POST请求报文内容自定义负载策略

简介: 上游服务调用下游服务的接口,部分接口业务高峰期请求量大,下游服务器压力很大,会影响到其它接口的访问。如果通过增加下游服务器横向扩容会增加成本,且在业务高峰期还是有可能影响其他接口。所以需要使用Lua配置一种可以根据报文内容进行负载的策略(调用接口的URL是固定的,下游服务通过解析报文调用对应接口)。

Nginx集成Lua实现根据POST请求报文内容自定义负载策略

需求概要

如下图,上游服务调用下游服务的接口,部分接口业务高峰期请求量大,下游服务器压力很大,会影响到其它接口的访问。如果通过增加下游服务器横向扩容会增加成本,且在业务高峰期还是有可能影响其他接口。所以需要使用Lua配置一种可以根据报文内容进行负载的策略(调用接口的URL是固定的,下游服务通过解析报文调用对应接口)。

基于Lua解析POST请求报文自定义Nginx负载策略

Nginx集成Lua单元

1.资源准备

2.安装luajit

1)解压luajit2-2.1.tar.gz

执行命令:tar -zxvf luajit2-2.1.tar.gz

2)编译安装

执行命令:

cd luajit2-2.1-20210510

make && make install

export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1

3.安装Nginx

1)解压相关资源

执行命令:

tar -zxvf lua-nginx-module-0.10.10.tar.gz

tar -zxvf nginx-1.18.0.tar.gz

tar -zxvf ngx_devel_kit-0.3.1.tar.gz

2)编译安装

执行命令:

cd nginx-1.18.0/

image-20210928164632999

执行下面命令前,先配置好最后两行add-module的ngx_devel_kit-0.3.1、lua-nginx-module-0.10.10的正确路径。

执行命令:

./configure \
--user=nobody                          \
--group=nobody                         \
--prefix=/etc/nginx                   \
--sbin-path=/usr/sbin/nginx           \
--conf-path=/etc/nginx/nginx.conf     \
--pid-path=/var/run/nginx.pid         \
--lock-path=/var/run/nginx.lock       \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module        \
--with-http_stub_status_module        \
--with-http_ssl_module                \
--with-pcre                           \
--with-file-aio                       \
--with-http_realip_module             \
--without-http_scgi_module            \
--without-http_uwsgi_module           \
--without-http_fastcgi_module ${NGINX_DEBUG:+--debug} \
--with-ld-opt="-Wl,-rpath,/usr/local/lib" \
--add-module=/home/nginx_with_lua/ngx_devel_kit-0.3.1 \
--add-module=/home/nginx_with_lua/lua-nginx-module-0.10.10

执行:make && make install

4.验证Lua

1)修改Nginx配置文件

执行命令:

vi /etc/nginx/nginx.conf

添加如下内容:

server {
    listen       80;
    server_name  localhost;

    location /hello_lua {
         default_type 'text/plain';
         content_by_lua 'ngx.say("hello, lua!")';
    }
}

执行命令:

nginx -s reload

如下图,在浏览器输入地址返回“hello,lua”后,则Lua单元安装成功。

image-20210928170640477

实现Lua解析POST请求报文

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    upstream tom1 {
        #配置业务高峰期承担主要业务的服务器列表
        server 192.168.64.4:8081;
        server 192.168.64.5:8081;
        server 192.168.64.6:8081;
    }
    upstream tom2 {
        #配置业务高峰期承担次要业务的服务器列表
        server 192.168.64.6:8082;
    }
    server {
        listen 80;
        server_name localhost;
        location /hello {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Url-Scheme $scheme;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            proxy_redirect off;

            if ($request_method = POST ) {
                set $upstream '';
                #access_by_lua用于请求访问阶段处理,用于访问控制
                access_by_lua '
                #读取请求报文
                ngx.req.read_body()
                local data = ngx.req.get_body_data()
                #判断报文中是否含有WMA2000字段
                local match1 = ngx.re.match(ngx.var.request_body, "WMA2000")
                #判断报文中是否含有WMA2001字段
                local match2 = ngx.re.match(ngx.var.request_body, "WMA2001")
                #如果POST报文内容中含有WMA2000,则将请求发往tom1负载列表
                if match1 then
                #使用tom1负载列表
                ngx.var.upstream = "tom1"
                end
                #如果POST报文内容中含有WMA2001,则将请求发往tom2负载列表
                if match2 then
                #使用tom2负载列表
                ngx.var.upstream = "tom2"
                end
                ';
                proxy_pass http://$upstream;
            }
        }
    }
}

经验证当POST请求报文带有“WMA2000”字段时,会负载到tom1列表中的服务器。当POST请求报文带有“WMA2001”字段时会负载到tom2列表中的服务器。


欢迎大家留言交流!

相关文章
|
7月前
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
80 0
|
3天前
|
敏捷开发 缓存 Devops
构建高效持续集成系统的策略与实践
【4月更文挑战第23天】 在快速迭代的软件开发过程中,持续集成(CI)是确保代码质量和加速交付的关键。本文深入探讨了构建和维护一个高效CI系统的方法和最佳实践。从自动化测试到部署策略,文中细致分析了各环节的优化技巧,并提供了解决常见问题的实用建议。通过案例研究和工具选型,读者将获得构建强大CI流程的具体指导,以支持敏捷和DevOps环境下的高质量软件发布。
|
Java 测试技术
Java 中的单元测试和集成测试策略
【4月更文挑战第19天】本文探讨了Java开发中的单元测试和集成测试。单元测试专注于单一类或方法的功能验证,使用测试框架如JUnit,强调独立性、高覆盖率和及时更新测试用例。集成测试则验证模块间交互,通过逐步集成或模拟对象来检测系统整体功能。两者相辅相成,确保软件质量和降低修复成本。
|
19天前
|
应用服务中间件 网络安全 nginx
Nginx性能调优策略
Nginx性能调优策略
20 0
Nginx性能调优策略
|
1月前
|
敏捷开发 监控 Devops
深入探究持续集成中的自动化测试策略
【2月更文挑战第29天】随着敏捷开发和DevOps文化的普及,持续集成(CI)已成为软件开发流程中不可或缺的一部分。CI流程的核心在于快速、频繁地集成代码更改,并确保这些更改不会破坏已有功能。本文将重点探讨在持续集成环境中实施自动化测试的策略,以及如何通过有效的测试实践来提高软件质量和交付速度。我们将分析不同的测试级别、测试类型以及它们如何整合到CI流程中,同时讨论如何优化测试过程以减少反馈周期时间,并确保高质量的构建。
|
1月前
|
敏捷开发 分布式计算 数据管理
探索自动化测试在持续集成环境中的优化策略
【2月更文挑战第18天】 在高速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快交付速度的关键。本文深入探讨了自动化测试在持续集成(CI)环境中面临的挑战,并提出了一系列优化策略。通过对测试流程、工具选择和测试数据管理等方面的细致分析,旨在为软件测试人员提供实用的改进方法,以提高自动化测试的效率和准确性。
|
3月前
|
存储 数据处理
Dataphin集成任务支持自定义FTP标记完成文件内容(V3.14)
在文件传输的场景中,标记完成文件(有时也被称为标档文件)作为一种重要的确认机制被广泛应用。这一机制通过创建特定的“传输完成标识文件”,用于明确指示数据文件已成功完成全量传输,并达到可以进行下一步业务处理的状态,从而有效防止了基于不完整数据流的错误操作。
|
3月前
|
缓存 前端开发 应用服务中间件
Nginx多方面调优策略
Nginx多方面调优策略
63 0
|
3月前
|
Web App开发 存储 前端开发
谈谈企业级应用的自定义 UI 创建和集成方法一览
谈谈企业级应用的自定义 UI 创建和集成方法一览
31 0
|
4月前
|
安全 架构师 Java
SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)
SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)
126 0