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列表中的服务器。


欢迎大家留言交流!

相关文章
|
15天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
33 3
|
1月前
|
数据采集 安全 数据管理
深度解析:DataHub的数据集成与管理策略
【10月更文挑战第23天】DataHub 是阿里云推出的一款数据集成与管理平台,旨在帮助企业高效地处理和管理多源异构数据。作为一名已经有一定 DataHub 使用经验的技术人员,我深知其在数据集成与管理方面的强大功能。本文将从个人的角度出发,深入探讨 DataHub 的核心技术、工作原理,以及如何实现多源异构数据的高效集成、数据清洗与转换、数据权限管理和安全控制措施。通过具体的案例分析,展示 DataHub 在解决复杂数据管理问题上的优势。
222 1
|
2月前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
68 5
|
11天前
|
存储 测试技术 持续交付
Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用
本文探讨了Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用。首先介绍了CI/CD的基本概念,接着阐述了Docker在环境一致性、快速部署、资源隔离和轻量化方面的优势。文章还详细讨论了构建、测试和部署阶段的具体集成方法,以及集成后带来的效率提升、可靠性增强、加速交付和易于管理等好处。最后,通过案例分析展示了集成的实际效果,强调了Docker与CI/CD结合的重要性和未来前景。
20 2
|
4月前
|
监控 测试技术 持续交付
|
2月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
2月前
|
存储 数据可视化 JavaScript
可视化集成API接口请求+变量绑定+源码输出
可视化集成API接口请求+变量绑定+源码输出
59 4
|
2月前
|
Docker 容器
docker nginx-proxy 添加自定义https网站
docker nginx-proxy 添加自定义https网站
41 4
|
2月前
|
负载均衡 算法 应用服务中间件
Nginx入门 -- 理解 Nginx 的请求处理流程
Nginx入门 -- 理解 Nginx 的请求处理流程
133 1
|
2月前
|
JSON 网络协议 应用服务中间件
Nginx入门 -- 理解Nginx基础概念:请求处理(Request)
Nginx入门 -- 理解Nginx基础概念:请求处理(Request)
57 0