IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Nginx集成Lua实现根据POST请求报文内容自定义负载策略 -> 正文阅读

[系统运维]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列表中的服务器。

欢迎大家关注我,更多Linux干货等着你!

?

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:44:28  更:2021-09-29 10:46:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:02:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码