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

news2024/11/15 9:55:11

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: mynginx
    image: nginx:1.22.0
#    volumes:
#      - ./conf/nginx.conf:/etc/nginx/nginx.conf
#      - ./conf/conf.d:/etc/nginx/conf.d
#      - ./log/nginx:/var/log/nginx
    ports:
      - "19096:19096"
      - "80:80"
    networks:
      - test-network
    privileged: true
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

networks:
  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_server
        proxy_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_servers
        mirror /mirror1;
        mirror /mirror2;

        mirror_request_body on;  # 启用镜像请求的请求主体
        proxy_pass_request_body on;

    }

    # Mirror location
    location = /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.coloradmin.cn/o/1807748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TMS320F280049学习3:烧录

TMS320F280049学习3:烧录 文章目录 TMS320F280049学习3:烧录前言一、烧录RAM二、烧录FLASH总结 前言 DSP的烧录分为两种,一种是将程序烧录到RAM中,一种是烧录到FLASH中,烧录ARM中的程序,只要未掉电&#x…

Linux驱动应用编程(四)IIC(获取BMP180温度/气压数据)

本文目录 一、基础1. 查看开发板手册,获取可用IIC总线2. 挂载从机,查看从机地址。3. 查看BMP180手册,使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

配网终端通讯管理板,稳控装置通讯管理卡,铁路信号通讯管理卡

配网终端通讯管理板 ● 配网终端通讯管理板 ● ARM Cortex™-A5 ,533MHz ● 256MB RAM,512MB FLASH 配网终端通讯管理板 ARM Cortex™-A5 ,533MHz 256MB RAM,512MB FLASH 2x10/100/1000Mbps LAN(RJ45) 6x…

FastAPI系列 4 -路由管理APIRouter

FastAPI系列 -路由管理APIRouter 文章目录 FastAPI系列 -路由管理APIRouter一、前言二、APIRouter使用示例1、功能拆分2、users、books模块开发3、FastAPI主体 三、运行结果 一、前言 未来的py开发者请上座,在使用python做为后端开发一个应用程序或 Web API&#x…

MySQL数据库---LIMIT、EXPLAIN详解

分页查询 语法 select _column,_column from _table [where Clause] [limit N][offset M]select * : 返回所有记录limit N : 返回 N 条记录offset M : 跳过 M 条记录, 默认 M0, 单独使用似乎不起作用 limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录…

贪心算法学习三

例题一 解法(贪⼼): 贪⼼策略: ⽤尽可能多的字符去构造回⽂串: a. 如果字符出现偶数个,那么全部都可以⽤来构造回⽂串; b. 如果字符出现奇数个,减去⼀个之后,剩下的…

对象存储OSS 客户端签名直传的安全风险和解决方法

1. 前言 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面…

AXI Quad SPI IP核中命令的使用

1 双通道SPI和混合内存模式下支持的常用命令 对于配置中Mode设置为Dual且Slave Device设置为Mixed的情况,IP核支持表3-1中列出的命令。这些命令在Winbond、Micron和Spansion内存设备上具有相同的命令、地址和数据行为。 某些命令,如fast read、dual I/…

产品创新:驱动企业增长的核心动力

在当今快速变化的市场环境中,产品创新已成为企业生存和发展的关键。产品创新不仅涉及全新产品或服务的开发,也包括对现有产品或服务的持续改进和优化。本文将深入探讨产品创新的定义、重要性以及如何通过创新驱动企业增长,并结合实际案例进行…

每位比特币人都终将成为一个国际主义者

原创 | 刘教链 周末BTC(比特币)趁势向着30日均线回归,现于69k一线悬停。7万刀以下加仓的机会窗口,和那蹉跎一生的岁月一样,过一天少一天,在每个纠结和拧巴的日子里,在软弱和彷徨的等待中&#x…

Python 算法交易实验71 QTV200数据流设计

说明 结构作为工程的基础,应该在最初的时候进行合理设计。这一次版本迭代,我希望最终实现的效果,除了在财务方法可以达到预期,在工程方面应该可以支持长期的维护、演进。 内容 1 财务表现期待 假设初始为60万资金作为主动资金…

Java学习 - MyBatis - 初识MyBatis

前言 什么是持久化 持久化是将程序数据在持久状态和瞬时状态间转换的机制,将数据保存到可永久保存的存储设备中。最常见的就是将内存中的对象存储在数据库中,或者存在磁盘文件、XML 数据文件中等等。其中,文件 IO 属于持久化机制&#xff0…

Web后端开发(请求-数组集合、日期、JSON参数)(三)

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数 RequestMapping("/arrayParam") public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "OK"; } …

Spring Event如何优雅实现系统业务解耦

Spring Event如何优雅实现系统业务解耦 一、介绍 Spring事件(Spring Event)是Spring框架的一项功能,它允许不同组件之间通过发布-订阅机制进行解耦的通信。在Spring中,事件是表示应用程序中特定事件的对象,例如用户注…

AI数据分析:根据Excel表格数据绘制柱形图

工作任务:将Excel文件中2013年至2019年间线上图书的销售额,以条形图的形式呈现,每个条形的高度代表相应年份的销售额,同时在每个条形上方标注具体的销售额数值 在deepseek中输入提示词: 你是一个Python编程专家&#…

OpenGauss数据库-4.表的创建、修改与删除

第1关:创建表 gsql -d postgres -U gaussdb -W passwd123123 create database testdb; \c testdb; passwd123123 create table test_table (test_id integer not null,test_info char(36)); 第2关:修改表 gsql -d testsb -U gaussdb -W passwd123123 …

Python实现删除Word文档中带有“指定内容”的段落文本(7)

前言 本文是该专栏的第7篇,后面会持续分享Python办公自动化干货知识,记得关注。 在处理word文档内容的时候,有时候我们需要一个干净整洁的文本内容。比如说,如下图所示的情况: 在处理上述word文档内容的时候,我们希望将文本底部的“下载链接”以及“附件信息”两个段落,…

Virustotal查询恶意进程

1、使用netstat查看可疑进程 执行ls -al /proc/$PID/exe确认可疑进程对应的文件;若文件未被删除,则直接上传文件到Virustotal进行检测,或者计算出文件对应的md5,使用md5去Virustotal进行查询;若文件已被删除&#xff0…

aabb c++

题目描述 查找形如"aabb"的四位完全平方数,也即前两位数字相同,后两位数字也相同。 输入 无 输出 若干行,每行一个符合条件的四位数(从小到大)。 分析: 完全平方数: &#xff…

[图解]建模相关的基础知识-07

1 00:00:04,710 --> 00:00:08,900 这是划分,下一个是有序对的概念 2 00:00:11,720 --> 00:00:13,800 我们知道集合是不分顺序的 3 00:00:15,090 --> 00:00:18,200 我们花括号来代表集合的话 4 00:00:18,210 --> 00:00:21,000 AB花括号等于BA花括号 …