nginx mirror流量镜像详细介绍以及实战示例

nginx mirror流量镜像详细介绍以及实战示例

  • 1.nginx mirror作用
  • 2.nginx安装
  • 3.修改配置
    • 3.1.nginx.conf
    • 3.2.conf.d目录下添加default.conf配置文件
    • 3.3.nginx配置注意事项
    • 3.3.nginx重启
  • 4.测试

1.nginx mirror作用

为了便于排查问题,可能希望线上的请求能够同步到测试环境,以便于验证某些功能;或者是在多个环境的情况下,希望能够将某些请求在几个环境中同步,比如调用环境A接口保存的数据,也需要在环境B、环境C中保存。而如果没有特别配置,则这个请求就只在当前环境中生效,这无法满足我们的需求。于是,我们需要引入流量镜像这一概念。

2.nginx安装

注意:nginx 1.13.4及后续版本才包含内置ngx_http_mirror_module模块,提供流量镜像(复制)的功能。
使用docker-compose安装nginx。本文使用的nginx版本为1.22.0.若还没有安装docker-compose的可以点击这里 查看教程。
拉取镜像:docker pull nginx:1.22.0
配置docker-compose.yml

version: "3.3"
services:mynginx:container_name: mynginximage: nginx:1.22.0
#    volumes:
#      - ./conf/nginx.conf:/etc/nginx/nginx.conf
#      - ./conf/conf.d:/etc/nginx/conf.d
#      - ./log/nginx:/var/log/nginxports:- "19096:19096"- "80:80"networks:- test-networkprivileged: truedeploy:replicas: 1update_config:parallelism: 2delay: 10srestart_policy:condition: on-failurenetworks:test-network:

启动:docker-compose up -d
注意:第一次启动时需要将volumes目录挂载注释掉,否则nginx会启动失败。
启动成功后,再将nginx的配置文件复制出来,后续直接在外面修改配置,而不需要再进入到容器内。
复制配置文件到conf目录内:

mkdir conf
docker cp mynginx:/etc/nginx/nginx.conf ./conf/nginx.conf
docker cp mynginx:/etc/nginx/conf.d ./conf/conf.d

复制完成后,再将上面docker-compose.yml中的volumes挂载都取消注释,然后重新启动,执行命令:docker-compose up -d
至此,nginx安装启动完成。

3.修改配置

3.1.nginx.conf

配置如下,include /etc/nginx/conf.d/*.conf; 表示会把/etc/nginx/conf.d目录下所有.conf结尾的文件都加载进来,所以我们不需要改这个文件,直接修改conf.d目录下的配置即可。
在这里插入图片描述

3.2.conf.d目录下添加default.conf配置文件

如果已存在default.conf配置,可以删掉再重新添加,内容如下

# 定义三个后端服务的 upstream
upstream main_server {server 192.168.80.251:9096;
}upstream mirror_server1 {server 192.168.80.251:9097;
}upstream mirror_server2 {server 192.168.80.251:9098;
}# 主要的 server 块
server {listen 19096;access_log /var/log/nginx/access.log main;error_log /var/log/nginx/error.log warn;location / {# 主要逻辑,传到 main_serverproxy_pass http://main_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 镜像流量到 mirror_serversmirror /mirror1;mirror /mirror2;mirror_request_body on;  # 启用镜像请求的请求主体proxy_pass_request_body on;}# Mirror locationlocation = /mirror1 {internal; # 内部调用,不对外开放proxy_pass http://mirror_server1$request_uri;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location = /mirror2 {internal; # 内部调用,不对外开放proxy_pass http://mirror_server2$request_uri;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}

3.3.nginx配置注意事项

  1. internal 指令的使用:internal 指令表示该 location 只能被内部请求访问。在 mirror 配置中,这是正确的设置,但请确保在 proxy_pass 指令中正确传递 URI。
  2. 检查 proxy_pass 指令:确保在 proxy_pass 指令中传递的 URI 是正确的。特别是在镜像请求部分:
	proxy_pass http://mirror_server1$request_uri;
  1. mirror_request_body on; # 启用镜像请求的请求主体 on | off,这行只需在主 location 块中配置一次。
  2. 在 Nginx 中,设置 mirror_request_body on; 会将请求主体数据镜像到指定的地方,而proxy_pass_request_body on; 则是允许在镜像请求中将客户端发送的请求主体传递到镜像的后端服务器。
      如果只设置了 mirror_request_body on; 而没有设置 proxy_pass_request_body on;,实际上 Nginx 也仍然会将请求数据保存到镜像和主体服务。这是因为 mirror_request_body on; 的作用是镜像请求主体数据,即将请求数据复制到指定的地方,而不影响实际的后端请求。即使没有显式设置 proxy_pass_request_body on;,Nginx 仍然会默认将请求主体数据通过镜像保存下来。
      当客户端发送请求时,Nginx会根据配置将请求主体数据镜像到指定的地方,无论是否设置了 proxy_pass_request_body on;。但是,如果需要将这些请求主体数据传递到后端服务器,则需要显式地设置 proxy_pass_request_body on;。
      因此,即使没有设置 proxy_pass_request_body on;,Nginx 仍然会处理请求主体数据并将其保存到镜像和主体服务,但如果需要将这些数据传递到后端服务器,还是需要设置 proxy_pass_request_body on;。
  3. $request_uri;$request_uri 是一个 Nginx 变量,代表客户端请求的 URI。在 Nginx 配置中,它可以用于传递当前请求的 URI。在主服务中,通常不需要在 proxy_pass 指令中配置 $request_uri,因为默认情况下,proxy_pass 会传递原始请求的 URI。但在一些特殊情况下,您可能希望将当前请求的 URI 传递给后端服务器,这时可以在主服务中使用 $request_uri。在镜像服务中,由于要确保传递的是镜像请求的 URI,通常会显式地使用 $request_uri。因此,需要根据具体需求在不同的 location 中决定是否使用 $request_uri。
	proxy_pass http://mirror_server1$request_uri;
  1. proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    这几行 proxy_set_header 指令用于设置向后端服务器传递的请求头信息。它们分别设置了 Host、X-Real-IP、X-Forwarded-For 和 X-Forwarded-Proto 请求头。这些请求头在代理过程中非常重要,它们能够让后端服务器了解到客户端的真实 IP、协议类型等信息。这些指令通常需要在主服务和镜像服务中都配置,以确保传递给后端的请求头是完整的、准确的,并且包含了必要的信息。

3.3.nginx重启

修改完配置nginx配置后,重启服务:docker exec -it mynginx nginx -s reload
或者 进入容器内重启:

docker exec -it mynginx 
nginx -s reload

4.测试

监听的19096端口为nginx的服务,9096、9097、9098为三个相同的服务的端口,9096端口为主服务,9097、9098为镜像服务
例如调用接口:http://192.168.80.251:9096/data/receive/receiveImgtList,数据只会保存在9096服务;
例如调用接口:http://192.168.80.251:19096/data/receive/receiveImgtList,数据会在这三个服务都保存;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/347427.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm QThread 设置断点不起作用

背景: 端午节回来上班第一天,不想干活,领导又再后面看着,突然想起一个有意思的问题,为啥我的程序在子进程QThread的子类里打的断点不好用呢?那就解决一下这个问题吧。 原因: 如果您的解释器上…

开发框架表单设计器办公效率高吗?

对于很多职场人来说,拥有一款可以提质、增效、降本的办公利器是大有裨益的。随着科技的进步和发展,低代码技术平台凭借可视化界面、易操作、好维护、高效率等多个优势特点,成为大众喜爱的办公利器。开发框架表单设计器是减少信息孤岛&#xf…

macbook本地部署 pyhive环境连接 hive用例

前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表,目前一个可行的方案是使用Python语言,通过借助pyhive库,您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么? PyHive是一…

从零到一建设数据中台(番外篇)- 数据中台UI欣赏

番外篇 - 数据中台 UI 欣赏 话不多说,直接上图。 数据目录的重要性: 数据目录是一种关键的信息管理工具,它为组织提供了一个全面的、集中化的数据资产视图。 它不仅记录了数据的存储位置,还详细描述了数据的结构、内容、来源、使…

细说ARM MCU的串口接收数据的实现过程

目录 一、硬件及工程 1、硬件 2、软件目的 3、创建.ioc工程 二、 代码修改 1、串口初始化函数MX_USART2_UART_Init() (1)MX_USART2_UART_Init()串口参数初始化函数 (2)HAL_UART_MspInit()串口功能模块初始化函数 2、串口…

批量申请SSL证书如何做到既方便成本又最低

假如您手头拥有1千个域名,并且打算为每一个域名搭建网站,那么在当前的网络环境下,您必须确保这些网站通过https的方式提供服务。这意味着,您将为每一个域名申请SSL证书,以确保网站数据传输的安全性和可信度。那么&…

面试-NLP八股文

机器学习 交叉熵损失: L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差: L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

【ai】openai-quickstart 配置pycharm工程

之前都是本地执行脚本【AI】指定python3.10安装Jupyter Lab环境为:C:\Users\zhangbin\AppData\Local\Programs\Python\Python310 参考之前创建的python工程 使用的是局部的私有的虚拟环境 pycharm给出的解释器 直接使用现有的,不new了 可以选择3.10 :可以选虚拟的:

Rust-02-变量与可变性

在Rust中,变量和可变性是两个重要的概念。 变量:变量是用于存储数据的标识符。在Rust中,变量需要声明其类型,例如: let x: i32 5; // 声明一个名为x的变量,类型为i32(整数)&#…

SpringCloud 前端-网关-微服务-微服务间实现信息共享传递

目录 1 网关获取用户校验信息并保存至请求头(前端-网关) 2 微服务获取网关中的用户校验信息(网关-微服务) 2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加 2.2 定义拦截器 2.3 定义…

简单通用的系统安装、备份、还原方法,支持 ARM 系统【Ventory+FirePE+DiskGenius】

文章目录 0. 简介1. 制作 Ventory 启动盘1.1. 下载 Ventory1.2. 制作 Ventory 启动盘 2. 添加 FirePE 等系统镜像到启动盘2.1. 下载 FirePE2.2. 导出 .iso 系统镜像文件2.3. .iso 系统镜像文件添加至启动盘 3. 启动 FirePE 等系统镜像3.1. 在 bios 中选择启动盘启动3.2. 启动系…

# RocketMQ 实战:模拟电商网站场景综合案例(八)

RocketMQ 实战:模拟电商网站场景综合案例(八) 一、RocketMQ 实战:模拟电商网站场景综合案例–下单异常问题演示 1.png 1、如果订单在扣减库存、扣减优惠券、扣减余额后,在 未 确认订单 前,出现了异常&am…

vue+element el-select动态加减框数量及验证下拉框选项动态置灰(选中行的下拉框换个值后,原值没办法监控这个问题也解决了)

1效果: 2部分主要(HTML): 1:这个位置主要就是看看方法什么的吧,还有大概的结构 2:change"sort_Change(item,tablelists.orderbyList)这两个参数(都有大用): (1)item:代表每次你操作的这个数据 (2)tablelists.orderbyList:代表你这一共有几行数据(上边这个例子就会得到一个…

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字,并且时间长了会掉色,使汉字模糊难认,这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…

2024年安全现状报告

2024 年安全现状报告有些矛盾。尽管安全专业人员的道路困难重重,比如说严格的合规要求、不断升级的地缘政治紧张局势和更复杂的威胁环境,但整个行业还是在取得进展。 许多组织表示,与前几年相比,网络安全变得更容易管理。组织之间…

AI赋能银行国际结算审单:合合信息抽取技术的实践与应用

官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 时下,银行国际业务是金融体系的重要组成部分,涵盖了外汇交易、国际结算、贸易融资、跨境投资等领域,这些业务对于国际贸易和全球经济发展具有重要作用。国际业务部门单据、凭证…

OpenGL系列(五)纹理贴图

概述 OpenGL纹理是一种在三维图形中应用纹理映射的技术。纹理是一张图像,可以应用到三维模型的表面上,从而使得模型看起来更加真实和具有细节。通过纹理映射,可以将图像的像素值与三维模型的顶点进行匹配,从而为模型的表面增加细节…

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口 本文提供一个基于OCR和机器学习的验证码识别接口,能够识别较复杂的中文、英文验证码,在OCR的基础上针对验证码进行算法优化。本接口是收费的(最低0.5分1次调用,试…

23种设计模式之代理模式

代理模式 1、概念 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问 代理模式是常用的结构型设计模式之一,在Java RMI、Web Service、Spring AOP等技术和框架中都使用了代理模式 2、代理模式结构 Subject&a…

解析 Spring 框架中的三种 BeanName 生成策略

在 Spring 框架中,定义 Bean 时不一定需要指定名称,Spring 会智能生成默认名称。本文将介绍 Spring 的三种 BeanName 生成器,包括在 XML 配置、Java 注解和组件扫描中使用的情况,并解释它们如何自动创建和管理 Bean 名称。 1. Be…