Nginx实现接口复制的示例代码

 更新时间:2025年01月09日 14:33:52   作者:有一只柴犬  
本文主要介绍了使用Nginx的mirror指令和Lua脚本实现接口流复制,方便将请求同时转发到多个后端服务器,具有一定的参考价值,感兴趣的可以了解一下

1、前言

项目中,通常会遇到一个中转服务需要往多个不同的系统推送同一份数据,传统做法是需要在Java代码侧中调用多个API接口进行发送。其实Nginx作为一个请求代理转发中间件必然具备类似的功能,常见就有mirror指令进行流的镜像复制。

2、接口流复制

2.1、方式一:使用mirror指令

注意:要使用nginx的mirror指令,需要nginx安装ngx_http_mirror_module模块。可以通过nginx -V命令查看。nginx 1.13.4及后续版本已经内置了ngx_http_mirror_module模块,之前的版本需要手动编译安装。

示例场景:

  • 发送一个主请求,端口8080;
  • nginx同时转发到8081服务和8082服务;
  • 8081和8082各自access log都有访问记录,且状态正常。

开撸,我这里准备的nginx版本为1.20.1。

2.1.1、nginx配置

server {
  listen 8080;
  index index.php index.html;
  server_name localhost;
  location / {
    mirror /mirror;
    proxy_pass http://localhostServer;
    }
    location = /mirror {
    internal;
    proxy_pass http://mirrorServer$request_uri;
    }
}

upstream localhostServer {
  server localhost:8081;
}

upstream mirrorServer {
  server localhost:8082;
}


server {
  listen 8081;
  server_name localhost;
  access_log /var/log/nginx/8081-access.log;
  root html/local;
}
server {
  listen 8082;
  server_name localhost;
  access_log /var/log/nginx/8082-access.log;
  root html/mirror;
}

接着在nginx的html目录下,创建local目录和mirror目录,并创建文件test.html。test.html内容随便填写:

mkdir -p local  mirror
touch test.html
echo "local.test---> test.html" >> test.html 
echo "mirror.test---> test.html" >> test.html 

2.1.2、配置说明

  • 主请求:/ 会将请求转发到 localhostServer。
  • 镜像请求:配置了 mirror 指令,将请求同时复制一份转发到 /mirror。/mirror 使用了 internal,防止客户端直接访问。
  • 镜像服务:/mirror 会将请求转发到 mirrorServer。

2.1.3、测试结果

由于8081和8082服务都配置了access log,因此当我们访问http://localhost:8080时,预期的结果是访问请求能得到正常的回显,并且8081和8082服务的access log都有相应的访问日志。

8081-access.log:

8082-access.log:

这样就完成了nginx实现接口复制的功能。Nginx 实现接口复制的需求通常用于在接收到请求后,将请求数据转发到多个后端服务器(例如用于日志记录、监控或者负载分摊)。

2.1.4、注意事项

  • 镜像请求是非阻塞的,Nginx 不会等待镜像请求的响应。
  • 镜像功能仅支持 HTTP 请求,不支持 WebSocket 或其他非 HTTP 协议。

2.2、方式二:使用Lua

Nginx支持Lua脚本有2种方式:

  • 手动编译nginx,加入ngx_http_lua_module模块;
  • 安装openresty,使用该组件的Nginx;

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

2.2.1、安装Openresty

下载最新版本的openresty,OpenResty - 下载。这里下载的是1.27.1.1版本。

这里下的是源码包,需要重新编译。

注:这里直接编译会使用QAT硬件加速,你需要手动安装QAT_Engine依赖。

这里直接禁用硬件加速,编译时排除qat:

./configure --without-http_qat_module
# 安装
make
sudo make install

 # 这里还需要安装resty.http模块
 /usr/local/openresty/bin/opm get ledgetech/lua-resty-http

安装完成后,启动openresty的nginx:

/usr/local/openresty/nginx/sbin/nginx

2.2.2、nginx配置

server {
    listen 8090;
    
        location / {
        content_by_lua_block {
        local http = require "resty.http"
        local res = ngx.location.capture("/localServer")
        
        local httpc = http.new()
        httpc:set_timeout(2000)
        
        local ok, err = httpc:request_uri("http://127.0.0.1:8092/test.html", {
            method = ngx.var.request_method,
            body = ngx.var.request_body,
            headers = ngx.req.get_headers(),
            follow_redirects = true,
        })
        
        if not ok then
            ngx.log(ngx.ERR, "Mirror request failed: ", err)
        end
            ngx.say(res.body)
        }
    }
    
    location /localServer {
        proxy_pass http://127.0.0.1:8091;
    }
    }

    server {
    listen 8091;
    server_name 127.0.0.1;
    access_log /usr/local/openresty/nginx/logs/8091-access.log;
    root html/local;

    }

    server {
    listen 8092;
    server_name 127.0.0.1;
    access_log /usr/local/openresty/nginx/logs/8092-access.log;
    root html/mirror;
    }

2.2.3、配置说明

  • 主请求:/ 会先处理主服务的请求,通过 ngx.location.capture 调用 /localServer。
  • 镜像请求:使用 Lua 的 resty.http 库,手动发起 HTTP 请求将数据复制到镜像服务器。
  • 返回响应:将主请求的结果返回给客户端。

2.2.4、测试结果

直接访问请求:curl http://localhost:8090/test.html

8901-access.log:

8902-access.log:

3、小结

  • 实时请求复制:推荐使用 ngx_http_mirror_module,简单易用。
  • 高级控制:如果需要复杂逻辑,使用 ngx_http_lua_module 配合 Lua 脚本。
  • 离线分析:通过日志记录请求数据,然后离线处理。

 到此这篇关于Nginx实现接口复制的示例代码的文章就介绍到这了,更多相关Nginx 接口复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Nginx的信号控制

    Nginx的信号控制

    今天小编就为大家分享一篇关于Nginx的信号控制,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • nginx报错connect() failed(111: Connection refused)while connecting to upstream解决方法

    nginx报错connect() failed(111: Connection refus

    本文主要介绍了nginx报错connect() failed(111: Connection refused)while connecting to upstream解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Nginx离线安装的保姆级教程

    Nginx离线安装的保姆级教程

    为了确保gcc-c++和Nginx的正确安装,建议使用yum工具在线下载rpm包,避免手动下载安装时出现依赖缺失的问题,本文就来介绍一下如何离线安装,感兴趣的可以了解一下
    2024-09-09
  • Nginx代理中使用斜杠的区别小结

    Nginx代理中使用斜杠的区别小结

    在使用nginx代理的过程中,斜线是一个非常重要的符号,因为它涉及到了请求路径的匹配问题,本文主要介绍了Nginx代理中使用斜杠的区别小结,感兴趣的可以了解一下
    2023-09-09
  • 详解Nginx如何根据swagger关键字屏蔽页面

    详解Nginx如何根据swagger关键字屏蔽页面

    这篇文章主要为大家详细介绍了Nginx 如何根据swagger关键字屏蔽页面的实现方案,文中有详细的解决方案,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-08-08
  • 教你快速构建一个基于nginx的web集群项目

    教你快速构建一个基于nginx的web集群项目

    本文教你快速构建一个基于nginx的4/7层负载均衡的web集群项目,项目步骤本文给大家介绍介绍,对nginx web集群项目感兴趣的朋友一起看看吧
    2021-11-11
  • nginx设置上传目录无执行权限的方法

    nginx设置上传目录无执行权限的方法

    在windows+iis下,可以设置上传目录,类似:upload,uploadfile,attachments,这样的目录下面无脚本执行权限,从而防止非法用户上传脚本得到webshell
    2010-11-11
  • nginx+tomcat实现负载均衡,使用redis session共享

    nginx+tomcat实现负载均衡,使用redis session共享

    这篇文章主要介绍了nginx tomcat负载均衡 使用redis session共享,有兴趣的同学可以了解一下。
    2016-12-12
  • CentOS 7下安装Nginx服务器

    CentOS 7下安装Nginx服务器

    这篇文章主要为大家详细介绍了CentOS 7下安装Nginx服务器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 从Nginx切换到Tengine的步骤分享

    从Nginx切换到Tengine的步骤分享

    由淘宝网发起的Web服务器 Tengine 可以被看作一个更好的Nginx,或者是Nginx的超集。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性
    2012-11-11

最新评论