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: 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.mfbz.cn/a/691935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python报错】TypeError: can only concatenate str (not “int“) to str

【Python报错】TypeError: can only concatenate str (not “int”) to str 在Python编程中,字符串连接是一种基本且频繁的操作。然而,如果你尝试将整数(int)与字符串(str)直接连接,会遇到TypeE…

扩散模型条件生成——Classifier Guidance和Classifier-free Guidance原理解析

1、前言 从讲扩散模型到现在。我们很少讲过条件生成(Stable DIffusion曾提到过一点),所以本篇内容。我们就来具体讲一下条件生成。这一部分的内容我就不给原论文了,因为那些论文并不只讲了条件生成,还有一些调参什么的…

金融领域的AI解决方案

AI可赋能金融营销、资管、风控等领域,面向金融消费者、金融机构和金融监管机构,改善金融 市场信息对称性并提升金融交易的效率和安全性。目前,金融行业各机构对于安全认证和客户身份识别的需求较为迫切,身份识别和智能客服应用和落…

Linux编译器-gcc或g++的使用

一.安装gcc/g 在linux中是不会自带gcc/g的,我们需要编译程序就自己需要安装gcc/g。 很简单我们使用简单的命令安装gcc:sudo yum install -y gcc。 g安装:sudo yum install -y gcc-c。 我们知道Windows上区分文件,都是使用文件…

Facebook企业户 | Facebook公共主页经营

Facebook作为社交媒体巨头,拥有庞大的用户基数,因此,有效经营公共主页是获取持续流量、提升客户信任度和粘性、促进产品或服务销售与转化的关键。要优化Facebook主页,关注以下几点: 1、参与度是关键指标:因…

iOS18:借助 Al,Siri 将获得广泛的知识,以便触发各个应用的功能

iOS18:借助 Al,Siri 将获得广泛的知识,以触发各个应用的功能 预计Siri将成为iOS18中一系列与人工智能相关增强功能的核心。 根据彭博社记者马克古尔曼的一份新报告,可以得知关于苹果智能助手的一些具体升级的新信息。 Siri新的人工智能: …

【ARM Cache 及 MMU 系列文章 6.3 -- ARMv8/v9 Cache Tag数据读取及分析】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Cache Tag 数据读取测试代码Cache Tag 数据读取 在处理器中,缓存是一种快速存储资源,用于减少访问主内存时的延迟。缓存通过存储主内存中经常访问的数据来实现这一点。为了有效地管…

关于软件调用独显配置指引【笔记】

关于笔记本电脑不支持独显直连的,bios下也是没有切换独显直连的选项的,处理方法 简单的来说按照图片指引可配置让软件调用独显: 1、进入系统→屏幕→显示卡界面; 2、【添加应用】浏览需要调用独显的软件安装目录,并打开…

UML实现图-部署图

概述 部署图(Deployent Diagram)描述了运行软件的系统中硬件和软件的物理结构。部署图中通常包含两种元素:节点和关联关系,部署图中每个配置必须存在于某些节点上。部署图也可以包含包或子系统。 节点是在运行时代表计算机资源的物理元素。节点名称有两种:简单名和…

(js)禁选下拉选框数组中包含的指定字符项

(js)禁选下拉选框数组中包含的指定字符项 const targetStr [编号, 日期, 时间, 标注] this.ziduanOptions.forEach((item) > {targetStr.forEach((ele) > {if (item.projectName.includes(ele)) {this.$set(item, disabled, true)}}) })

四十三、openlayers官网示例Freehand Drawing解析——在地图上自由绘制图形

想要在地图上绘制自由图形,只需要在new Draw的时候多加一个配置项就行。 function addInteraction() {const value typeSelect.value;if (value ! "None") {draw new Draw({source: source,type: typeSelect.value,freehand: true, //是否自由绘制});ma…

哪些专业毕业可以应聘 Java 编程师?就业前景如何?

Java 编程师通常来自以下几种专业背景: 1. 计算机科学与技术 - 这是最直接相关的专业,涵盖了广泛的编程知识和技能,包括Java。 2. 软件工程 - 专注于软件开发的生命周期,包括需求分析、设计、编程、测试和维护。刚好我有一些资料…

PromptPort:为大模型定制的创意AI提示词工具库

PromptPort:为大模型定制的创意AI提示词工具库 随着人工智能技术的飞速发展,大模型在各行各业的应用越来越广泛。而在与大模型交互的过程中,如何提供精准、有效的提示词成为了关键。今天,就为大家介绍一款专为大模型定制的创意AI…

使用OpenPCDet训练与测试多传感器融合模型BEVFusion,OPenPCdet代码架构介绍

引言 在自动驾驶领域,多传感器融合技术是一种常见的方法,用于提高感知系统的准确性和鲁棒性。其中,BevFusion是一种流行的融合方法,可以将来自不同传感器的数据进行融合,生成具有丰富信息的鸟瞰图(BEV&…

2024年最新Microsoft Edge关闭自动更新的方法分享

这里写自定义目录标题 打开【服务】 打开【服务】 windows中搜索服务,如下图: 打开服务界面,找到“Microsoft Edge Update Service (edgeupdate)” 及 “Microsoft Edge Update Service (edgeupdatem)” 两个服务,设置为禁用

力扣96 不同的二叉搜索树 Java版本

文章目录 题目描述代码 题目描述 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5 示例 2: 输入…

MYTED | TED100篇打卡总结 辅助学习网站使用说明

文章目录 📚背景🐇timeline🐇版本记录🐇产出小结 📚功能说明🐇左侧🐇中间🐇右侧 📚背景 🐇timeline 在一个平常的下午,一次平常的桌面整理&#…

Linux☞进程控制

在终端执行命令时,Linux会建立进程,程序执行完,进程会被终止;Linux是一个多任务的OS,允许多个进程并发运行; Linxu中启动进程的两种途径: ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…

How to: Build a Custom End-User Skin Selector

This section explains how to populate a ComboBoxEdit control with DevExpress skin items. 本节介绍如何使用DevExpress皮肤项填充ComboBoxEdit控件。 To populate a combo box editor, iterate through the SkinManager.Skins collection, which returns all currently a…

搜索引擎优化服务如何寻找?

首先你要了解搜索引擎优化,也就是seo具体是什么,要做些什么,然后就是确定你自身业务的需求,是要特定的关键词排名,还是整体网站流量的提升,还是想要优化目前的网站 接下来你就可以正式的寻找真正能帮助到你…