项目中,通常会遇到一个中转服务需要往多个不同的系统推送同一份数据,传统做法是需要在Java代码侧中调用多个API接口进行发送。其实Nginx作为一个请求代理转发中间件必然具备类似的功能,常见就有mirror指令进行流的镜像复制。
注意:要使用nginx的mirror指令,需要nginx安装ngx_http_mirror_module模块。可以通过nginx -V命令查看。nginx 1.13.4及后续版本已经内置了ngx_http_mirror_module模块,之前的版本需要手动编译安装。
示例场景:
开撸,我这里准备的nginx版本为1.20.1。
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
由于8081和8082服务都配置了access log,因此当我们访问http://localhost:8080时,预期的结果是访问请求能得到正常的回显,并且8081和8082服务的access log都有相应的访问日志。
8081-access.log:
8082-access.log:
这样就完成了nginx实现接口复制的功能。Nginx 实现接口复制的需求通常用于在接收到请求后,将请求数据转发到多个后端服务器(例如用于日志记录、监控或者负载分摊)。
Nginx支持Lua脚本有2种方式:
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
下载最新版本的openresty,https://openresty.org/cn/download.html。这里下载的是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
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;
}
直接访问请求:curl http://localhost:8090/test.html
8901-access.log:
8902-access.log:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。