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.mzph.cn/web/25400.shtml

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

相关文章

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台。通过搜索结果,我们可以了解到 TalkingData 的一些关键特性和市场情况,并将其与同类型产品进行比较。 TalkingData 产品特性 数据统计与分析:提供专业的数…

OSX-KVM - 在 QEMU/KVM上运行macOS

文章目录 依赖安装准备安装Headless macOSSetting Expectations Right安装后这合法吗?动机回馈贡献 OSX-KVM 支持早 QEMU/KVM上运行macOS。现在支持OpenCoreMontereyVenturaSonoma! 现在仅提供商业(付费)支持,以避免垃…

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归) 文章目录 算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)一、层序遍历二、226. 翻转二叉树(优先掌握递归)三、101. 对…

Elasticsearch index 设置 false,为什么还可以被检索到?

在 Elasticsearch 中,mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问,为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题,并引入列式存储的概念,帮助大家更好地理解 Elasticsearch 的存储和查…

在Tomcat 10.1.x上使用jstl

通过在Web应用程序项目的/WEB-INF/lib文件夹中放入以下两个Jar包 jakarta.servlet.jsp.jstl-3.0.1.jarjakarta.servlet.jsp.jstl-api-3.0.0.jar 在 jsp 页面导入 taglib 标签 <% taglib prefix"c" uri"jakarta.tags.core" %>

区分live(居住v)、live(直播的adj、直播地adv)、life/lives(生活n及其复数)的读音

文章目录 区分live&#xff08;居住v&#xff09;、live&#xff08;直播的adj、直播地adv&#xff09;、life/lives&#xff08;生活n及其复数&#xff09;的读音 区分live&#xff08;居住v&#xff09;、live&#xff08;直播的adj、直播地adv&#xff09;、life/lives&…

打造实用的时间序列数据处理类:Python中的TimeSeriesAnalyzer

题目:打造实用的时间序列数据处理类:Python中的TimeSeriesAnalyzer 在数据科学、金融分析和许多其他领域中,时间序列数据是非常常见的。处理这类数据通常需要特定的技术和方法。本文将介绍如何设计一个用于处理时间序列数据的Python类TimeSeriesAnalyzer,它包含了一些基本…

mysql数据库 自增id从指定数字开始

如果想要给每个用户一个七或者更多位数的uid&#xff0c;可以在用户表中设置id为自增&#xff0c;并且设置初始值 1.创建表时指定 CREATE TABLE user( -- 建表语句 )AUTO_INCTEMENT自增值; 例如 create table user (id int unsigned primary key auto_incremen…

基于STM32F030设计的多点温度采集系统(BC26+OneNet)

一、项目背景 随着物联网技术的迅猛发展&#xff0c;越来越多的智能设备应运而生&#xff0c;而温度采集系统是其中重要的一类。在现代工业和家庭生活中&#xff0c;温度对于生产、居住和储存等过程的控制有着非常重要的作用。因此&#xff0c;准确地采集环境温度数据并进行处…

HTML做成一个粒子漩涡特效页面

大家好&#xff0c;今天制作制作一个粒子漩涡特效的页面&#xff01; 先看具体效果&#xff1a; 要在一个单一的 index.html 页面中实现粒子漩涡特效&#xff0c;我们可以使用HTML、CSS和JavaScript&#xff08;不需要外部库&#xff09;。下面是一个简单的例子&#xff0c;展…

免费热榜API——哔哩哔哩

一、请求地址 http://api.dataguan.com/api/center/getBiBiHot 二、请求方式 post 三、接口文档 1、请求参数 到www.dataguan.com 免费获取apikey和sign&#xff0c;sign由apikey和apisecret生成 字段说明是否必传apiKey接口钥匙是sign签名是 2、响应说明 字段说明top…

JWT 从入门到精通

什么是 JWT JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案 JSON Web Token Introduction - jwt.ioLearn about JSON Web Tokens, what are they, how they work, when and why you should use them.https://jwt.io/introduction 一、常见会…

Git发布正式

一般我们开发都是在测试环境开发&#xff0c;开发完成后再发布到正式环境。 一.分支代码合并到主分支1.首先切换到自己的分支(比如分支叫&#xff1a;dev)git checkout dev2.把本地分支拉取下来git pull 或者 git pull origin dev3.切换到主分支mastergit checkout master4.更新…

【Vue】购物车案例-构建项目

脚手架新建项目 (注意&#xff1a;勾选vuex) 版本说明&#xff1a; vue2 vue-router3 vuex3 vue3 vue-router4 vuex4/pinia vue create vue-cart-demo需要勾选上vuex&#xff0c;由于这个项目只有一个页面&#xff0c;vuex可勾可不勾 将原本src内容清空&#xff0c;替换成教学…

【计算机网络基础】IP地址

文章目录 一、IP介绍IP地址和Mac地址IP地址分类 二、IPV4地址IPV4地址分类子网掩码进制转换方法8421法则转换法私网地址PNAT技术IP分配原则 三、IPv6地址IPV6组成IPV6分类IPV6特殊地址 四、VLSM可变长子网掩码划分子网VLSM优点 &#x1f308;你好呀&#xff01;我是 山顶风景独…

springboot+mqtt使用总结

1.软件的选型 1.1.使用免费版EMQX 1.1.1.下载 百度搜索的目前是会打开官网&#xff0c;这里提供下免费版的使用链接EMQX使用手册 文档很详细&#xff0c;这里不再记录了。 1.2.使用rabbitmq rabbitmq一般做消息队列用&#xff0c;作为mqtt用我没有找到详细资料&#xff0c…

异常(Exception)

异常是什么 异常就是程序在进行时的不正常行为&#xff0c;就像之前数组时会遇到空指针异常&#xff08;NullPointerException&#xff09;&#xff0c;数组越界异常&#xff08;ArrayIndexOutOfBoundsException&#xff09;等等。 在java中异常由类来表示。 异常的分类 异常…

2013年 阿拉斯加巴罗活动层厚度和土壤含水量

Pre-ABoVE: Active Layer Thickness and Soil Water Content, Barrow, Alaska, 2013 ABoVE前&#xff1a;阿拉斯加巴罗活动层厚度和土壤含水量&#xff0c;2013年 简介 文件修订日期&#xff1a;2018-01-10 数据集版本&#xff1a;1 摘要 该数据集提供了 2013 年 8 月在…

Java | Leetcode Java题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {if (head null) {return null;}ListNode slow head, fast head;while (fast ! null) {slow slow.next;if (fast.next ! null) {fast fast.next.next;} else {ret…