Nginx 又一牛 X 功能:流量拷贝_nginx x-origin-uri-程序员宅基地

1. 需求

将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如:

  • 可以验证功能是否正常,以及服务的性能;

  • 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问;

  • 这跟灰度发布还不太一样,镜像流量不会影响真实流量;

  • 可以用来排查线上问题;

  • 重构,假如服务做了重构,这也是一种测试方式;

为了实现流量拷贝,Nginx提供了ngx_http_mirror_module模块

2. 安装Nginx

首页,设置yum仓库。为此,创建一个文件/etc/yum.repos.d/nginx.repo

将以下内容写入文件

[nginx-stable]  
name=nginx stable repo  
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/  
gpgcheck=1  
enabled=1  
gpgkey=https://nginx.org/keys/nginx_signing.key  
module_hotfixes=true  

[nginx-mainline]  
name=nginx mainline repo  
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/  
gpgcheck=1  
enabled=0  
gpgkey=https://nginx.org/keys/nginx_signing.key  
module_hotfixes=true

yum安装nginx

yum install nginx -y

默认情况下,nginx配置文件是nginx.conf

一般情况下,nginx.conf文件在 /usr/local/nginx/conf  或者 /etc/nginx  或者 /usr/local/etc/nginx 目录下

为了启动nginx,直接在命令行里输入nginx回车即可

# 启动nginx  
nginx  
# fast shutdown  
nginx -s stop  
# graceful shutdown  
nginx -s quit  
# reloading the configuration file  
nginx -s reload  
# reopening the log files  
nginx -s reopen  
# list of all running nginx processes  
ps -ax | grep nginx

一旦master进程接收到重新加载配置的信号,它将检查新配置文件的语法是否正确,并尝试应用其中提供的配置。

如果成功,master进程将启动新的worker进程,并发送消息给旧的worker进程,要求他们shutdown。否则,master进程将回滚所做的更改,并继续使用旧配置。旧的worker进程在接收到关闭命令后,停止接受新的连接,直到所有之前已经接受的连接全部处理完为止。之后,旧的worker进程退出。

nginx的master进程的进程ID,默认情况下,放在nginx.pid文件中,该文件所在的目录一般是/usr/local/nginx/logs 或者 /var/run。

还可以这样停止nginx

kill -s QUIT 3997

初始配置文件长这样:

user  nginx;  
worker_processes  1;  

error_log  /var/log/nginx/error.log warn;  
pid        /var/run/nginx.pid;  


events {  
    worker_connections  1024;  
}  


http {  
    include       /etc/nginx/mime.types;  
    default_type  application/octet-stream;  

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '  
                      '$status $body_bytes_sent "$http_referer" '  
                      '"$http_user_agent" "$http_x_forwarded_for"';  

    access_log  /var/log/nginx/access.log main;  

    sendfile        on;  
    #tcp_nopush on;  

    keepalive_timeout  65;  

    #gzip on;  

    include /etc/nginx/conf.d/*.conf;  
}

3. ngx_http_mirror_module

The ngx\_http\_mirror_module module (1.13.4) implements mirroring of an original request by creating background mirror subrequests. Responses to mirror subrequests are ignored.

我是这样理解的,这里,mirror本意是镜子、镜像,这里可以理解就像一个镜像站点一样,将所有的请求都收集起来,这个镜像就代表了所有真实有效的原始请求。有了这个镜像,后续我们才可能用这个镜像去做一些事情,比如重现一下所有的请求,这就实现了把线上的流程复制到别的地方。

官网给出的示例倒是很简单,如下:

location / {  
    mirror /mirror;  
    proxy_pass http://backend;  
}  

location = /mirror {  
    internal;  
    proxy_pass http://test_backend$request_uri;  
}

如果请求体被镜像,那么在创建子请求之前会先读取请求体。

location / {  
    mirror /mirror;  
    mirror_request_body off;  
    proxy_pass http://backend;  
}  

location = /mirror {  
    internal;  
    proxy_pass http://log_backend;  
    proxy_pass_request_body off;  
    proxy_set_header Content-Length "";  
    proxy_set_header X-Original-URI $request_uri;  
}

前面我们安装了Nginx,但是里面没有包含我们所需的ngx_http_mirror_module模块,因此,真正要使用的时候最好还是采用自定义安装,即从源码构建。

首先,下载源码  http://nginx.org/en/download.html

接下来,编译安装,例如:

./configure  
    --sbin-path=/usr/local/nginx/nginx  
    --conf-path=/usr/local/nginx/nginx.conf  
    --pid-path=/usr/local/nginx/nginx.pid  
    --with-http_ssl_module  
    --without-http_limit_req_module  
    --without-http_mirror_module  
    --with-pcre=../pcre-8.43  
    --with-zlib=../zlib-1.2.11  
    --add-module=/path/to/ngx_devel_kit  
    --add-module=/path/to/lua-nginx-module  

make & make install

配置

upstream api.abc.com {  
  server 127.0.0.1:8080;  
}  

upstream tapi.abc.com {  
    server 127.0.0.1:8081;  
}  

server {  
    listen 80;  
   # 源站点  
    location /api {  
        proxy_pass http://api.cjs.com;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  

        # 流量复制  
  mirror /newapi;  
  mirror /mirror2;  
  mirror /mirror3;  

  # 复制请求体  
  mirror_request_body on;  
    }  

    # 镜像站点  
    location /tapi {  
        proxy_pass http://tapi.cjs.com$request_uri;  
        proxy_pass_request_body on;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    }  
}

4. 文档

Nginx文档

http://nginx.org/en/docs/

http://nginx.org/en/docs/http/ngx\_http\_mirror_module.html

http://nginx.org/en/docs/beginners_guide.html

http://nginx.org/en/docs/http/ngx\_http\_core_module.html#location 

http://nginx.org/en/docs/configure.html

第三方模板

http://luajit.org/

https://www.nginx.com/resources/wiki/

https://www.nginx.com/resources/wiki/modules/lua/

https://www.nginx.com/resources/wiki/modules/index.html

https://github.com/openresty/lua-nginx-module 

补充

# 查看进程运行时间  
ps -eo pid,user,lstart,etime,cmd | grep nginx  
# 查看已经建立连接的数量  
netstat -an | grep ESTABLISHED | wc -l  
# 查看80端口的连接数  
netstat -an | grep ":80" | wc -l

作者:废物大师兄 https://www.cnblogs.com/cjsblog/p/12163207.html

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

生活很美好,明天见~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/youanyyou/article/details/105427146

智能推荐

解决在设置中修改权限,返回当前运行中的应用发生崩溃的问题_android 关闭权限后 返回 app 白屏-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏5次。why:因为当权限发生改变后,当前程序的当前Activity会异常结束的,导致程序的数据丢失。当返回时,app会默认修复最后打开的那个界面。How:一个Activity的基类的onCreate方法中,判断savedInstanceState是否为null,如果为null,说明是正常启动,如果有数据,就是设置被修改,异常关闭情况下,程序会保存一些数据,所以在有数据的情况下,重新打开启动页。 protected void onCreate(Bundle savedInstanceState) {_android 关闭权限后 返回 app 白屏

2023最新微信ipad协议 834 附近人获取 CODE sessionId_2024微信附近人提取wxid-程序员宅基地

文章浏览阅读1.3k次。最新版本不封号 异地的话可能需要搭建 本地socks5代理 (搭建方法稍后出一个搭建教程 映射+本地搭建)抢购程序 获取 code 和 sessionId (这个用于换取支付二维码的生成)iPad协议已经更新了最新版本 可以用来获取附近人 营销。已完成微信95%以上功能 有相关问题可以私聊我。_2024微信附近人提取wxid

ERROR: The minSdk version should not be declared in the android manifest file.-程序员宅基地

文章浏览阅读5.6k次。具体错误为: ERROR: The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file. Remove minSdkVersion and sync project Affected Modules: T..._the minsdk version should not be declared in the android manifest file. you

告别代码复制粘贴,傻瓜式提取 PyTorch 中间层特征_pytorch提取中间层特征-程序员宅基地

文章浏览阅读8.8k次,点赞11次,收藏38次。内容导读:特征提取是图像处理过程中常需要用到的一种方法,其效果好坏对模型的泛化能力有至关重要的影响。特征提取(Feature extraction)在机器学习、模式识别和图像处理中应用广泛。它从初始的一组测量数据开始,建构出提供信息且不冗余的派生值,即特征值,从而促进后续的学习和泛化步骤。在使用 PyTorch 进行模型训练的过程中,经常需要提取模型中间层的特征。解决这个问题可以用到 3 种方法。对中间层进行特征提取的 3 大方法1、借助模型类的属性传递方法: 修改 forward 函数,通._pytorch提取中间层特征

设计模式篇章(4)——十一种行为型模式_设计模式行为11种-程序员宅基地

文章浏览阅读1.2k次,点赞23次,收藏13次。这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个动作触发的事件,具有一定行为的设计模式。现在不清楚没关系,学完23种设计模式再回头看就能理解了。行为型模式包括:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式共11种。_设计模式行为11种

邹检验,结构变化识别及其R语言实现_r语言 sctest-程序员宅基地

文章浏览阅读1.1k次。邹检验Chow test提供了最基本的一种结构变化显著性的检验方法,后续统计学者提供了复杂结构变化的识别和判定方法。针对情形2和3,Andrews(1993,2003)开发了sup-Wald(即一系列Wald检验的上确界)方法,sup-LM(即一系列拉格朗日乘数统计量的上确界)方法和sup-LR(即一系列极大似然比的上确界)方法用以检验结构变化。邹检验通过比较总样本回归的残差平方和与分组样本回归残差平方和之间的差值,构造了一个统计变量,该变量符合F分布,可以作为显著性的判断依据。结构变化检验的R语言实现。_r语言 sctest

随便推点

854大神JSP基于SSM校园二手书跳蚤市场交易平台可升级SpringBoot-计算机毕业源码设计-程序员宅基地

文章浏览阅读578次,点赞18次,收藏7次。图书出售: 出售id,图书主图,图书名称,图书类别,出版社,作者,出售价格,新旧程度,出售说明,发布用户,用户发布时间。求购: 求购id,图书主图,图书名称,图书类别,出版社,作者,求购价格,新旧程度,求购说明,发布用户,用户发布时间。用户: 用户名,登录密码,姓名,性别,出生日期,用户照片,联系电话,邮箱,家庭地址,注册时间。留言: 留言id,留言标题,留言内容,留言人,留言时间,管理回复,回复时间。图书订单: 订单id,图书信息,意向用户,意向出价,用户备注,下单时间。图书类别: 类别编号,类别名称。

开源微信小程序商城源码PHP带后台管理——构建高效电商平台的基石_小程序源码带后台-程序员宅基地

文章浏览阅读1k次。分享一款开源的微信小程序商城源码PHP,春哥七合一DIY小程序源码系统带后台管理功能,帮助你轻松构建高效的电商平台。开发成本低:相较于APP开发,微信小程序的开发成本更低,且无需下载安装,即用即走。统计报表:提供丰富的数据统计功能,方便商家分析平台运营情况,制定针对性的营销策略。开发与调试:根据平台需求和设计图,进行页面的开发和调试,确保功能的完整性和稳定性。上线发布:完成开发和测试后,进行上线发布,让用户开始使用你的微信小程序商城。权限管理:支持多用户管理,分配不同权限,确保平台数据的安全性和稳定性。_小程序源码带后台

2024|CISP认证详细报考流程和条件_cisp报考-程序员宅基地

文章浏览阅读1.2k次,点赞11次,收藏30次。CISP(Certified Information Security Professional,注册信息安全专业人员)证书是由中国信息安全测评中心(CNITSEC)颁发的专业资质证书,旨在为信息安全领域培养和认证具备一定专业水平的安全人才。CISP证书在中国信息安全行业中具有较高的认可度,适用于信息安全企业、咨询服务机构、政府机构、企事业单位等从事信息安全相关工作的专业人员。_cisp报考

ADS(Advanced Design system)原理图结合板层结构仿真(MSub)及版图仿真(EM Simulation)_ads版图仿真-程序员宅基地

文章浏览阅读2.7w次,点赞37次,收藏264次。ADS(Advanced Design system)原理图结合板层结构仿真(MSub)及版图仿真(EM Simulation)_ads版图仿真

bzoj1001: [BeiJing2006]狼抓兔子-程序员宅基地

文章浏览阅读1.4k次。1001: [BeiJing2006]狼抓兔子Time Limit: 15 Sec MemoryLimit: 162 MBDescription现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4

基于Java+Vue+uniapp微信小程序学生管理系统设计和实现_uni-app 学员信息管理系统-程序员宅基地

文章浏览阅读889次,点赞20次,收藏17次。互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用小程序学生管理系统可以有效管理,使信息管理能够更加科学和规范。小程序学生管理系统使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理小程序学生管理系统信息,查看小程序学生管理系统信息,管理小程序学生管理系统。_uni-app 学员信息管理系统

推荐文章

热门文章

相关标签