点赞
评论
收藏
分享
举报
Nginx集成Lua实现根据POST请求报文内容自定义负载策略
发表于2021-09-28 23:04

浏览 1.8k

需求概要

如下图,上游服务调用下游服务的接口,部分接口业务高峰期请求量大,下游服务器压力很大,会影响到其它接口的访问。如果通过增加下游服务器横向扩容会增加成本,且在业务高峰期还是有可能影响其他接口。所以需要使用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列表中的服务器。

公众号

已修改于2023-03-09 02:15
本作品系原创
创作不易,留下一份鼓励
Linux驯兽师

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
Linux驯兽师
这家伙很懒还未留下介绍~
2
文章
0
问答
1
粉丝
相关文章
介绍nginx网页配置工具QQ技术交流群1:1106758598QQ技术交流群2:560797506邮箱: cym1102@qq.com官网地址: http://www.nginxwebui.cn码云: https://gitee.com/cym1102/nginxWebUIgithub: https://github.com/cym1102/nginxWebUI功能特点nginxWebUI也可管理多个nginx服务器集群,随时一键切换到对应服务器上进行nginx配置,也可以一键将某台服务器配置同步到其他服务器,方便集群管理.部署此项目后,配置nginx再也不用上网各种搜索配置代码,再也不用手动申请和配置ssl证书,只需要在本项目中进行增删改查就可方便的配置和启动nginx。技术说明本项目是基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库项目启动时会释放一个.sqlite.db到系统用户文件夹中,注意进行备份本系统通过Let'sencrypt申请证书,使用acme.sh脚本
点赞 6
浏览 6.6k
  前三周学习了陶辉老师的“NGINX基础培训系列课程”,感觉受益良多,在这里想把一些知识点记录一下,和大家分享一下知识点,也方便日后的随手查看,温故知新。  首先,我们了解到了Nginx的版本,Nginx发布版本分为主线版本和稳定版本,区分两个版本也非常简单,主线版本版本号为单数,比如1.19,稳定版本为双数,比如1.18,今天我要说的是稳定版本,这个版本会尽量少的减少Nginx的bug问题,适用于生产环境,这里我不建议使用Nginx和其他软件一样在生产环境中落后一个或多个大版本使用,之前生产环境做过漏扫,发现我们编译自带的Nginx版本为:nginx/1.13.3(查询命令为nginx-V),结果出现了多个漏洞,四个高危和一个中危漏洞:        通过升级Nginx到稳定版最新版本后修复!  其次,是Nginx发行版本的选择,目前比较流行的有:nginx、nginxplus、Tengine、openresty、ope
点赞 1
浏览 3.6k
感谢您参加“NGINX从入门到精通进阶系列培训”!以下为培训的问答、课件和录像,希望您能通过此培训学有所得,祝学习进步!>问与答:- 基础篇+高级篇 - 应用篇+实战篇(New)>课件(PPT):基础篇:-NGINX概要、安装、配置:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-Setup.pdf-NGINX日志、运维:https://interact.f5.com/rs/653-SMC-783/images/cnfeb22-nginxcorecourse-maintenance.pdf高级篇:-NGINX变量、API:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-API.pdf-NGINXSSL、NJS:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-SSL.pdf
点赞 10
浏览 5.1k