作者:废物大师兄

链接:https://www.cnblogs.com/cjsblog/p/12163207.html

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

默认情况下,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本意是镜子、镜像,这里可以理解就像一个镜像站点一样,将所有的请求都收集起来,这个镜像就代表了所有真实有效的原始请求。有了这个镜像,后续我们才可能用这个镜像去做一些事情,比如重现一下所有的请求,这就实现了把线上的流程复制到别的地方。扩展:SpringBoot 项目构建 Docker 镜像调优实践

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

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-modulemake & 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 

热门内容:

  • 为了面试,从头到尾说一次 Java 垃圾回收

  • 大公司为什么都有API网关?没你想的那么简单!

  • SpringBoot 操作 ElasticSearch 详解(万字长文)

  • MySQL:互联网公司常用分库分表方案汇总

  • 一招搞定GitHub下载加速!

  • Java项目构建基础:统一结果,统一异常,统一日志(好文推荐)

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。

Nginx 一个牛X的功能,流量拷贝!相关推荐

  1. Nginx 一个牛 X 的功能,流量拷贝!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | cnblogs.com/cjsblog/p/1 ...

  2. Nginx 又一牛X的功能!流量拷贝

    「 读者福利!2 TB 各类技术资源免费赠送 」 1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证, ...

  3. nginx实现并发连接与IP流量限速功能

    目录 参考 前言 limit_conn_zone 模块 配置 测试 测试小文件 测试大文件 总结 limit_request 模块 配置 测试 测试1 - 不加 burst 和 不加 nodelay ...

  4. 一个牛B程序员的奋斗

    一个牛B程序员的奋斗 声明:此文为多年前的一位程序员所写,相信很多人都看过,许多新人很迷茫,那就看看此人是怎么奋斗的吧!希望此文能对广大程序员有所启发,共勉! 这些日子我一直在写一个实时操作系统内核, ...

  5. HTTP 流量拷贝测试神器 GoReplay

    以下文章来源于 一个 程序员 的 修炼之路 ,作者 河边 一枝 柳 一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等.但是这些测试往往都是基于自己定义的测试数据集合,很可能会 ...

  6. HTTP流量拷贝测试神器GoReplay

    一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等.但是这些测试往往都是基于自己定义的测试数据集合,很可能会有漏网之鱼,那么在软件上线之后,在线上的流量冲击下,会出现各种之前测 ...

  7. 一个牛逼的创业公司后台技术栈搭建方案

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:潘锦 本文转载自:架构与远方 技术经验交流:点击入群 说到后台技术栈,脑海中是不是浮 ...

  8. 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门

    喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...

  9. 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...

最新文章

  1. 经典算法学习——直接选择排序
  2. python 之socket 网络编程
  3. EasyUI中Datebox日期框的简单使用
  4. 安装仅限于用于sharepoint_酒泉汗蒸房设计施工厂家,家庭汗蒸房安装厂家
  5. 线性代数---矩阵的各种问题求解方法
  6. python 获取点击按钮名称_python如何获取tkinter组件的名称?比如按下多个Button中的一个,返回这个被按下的Button的text?...
  7. 博通:NFC将成手机标配nbsp;新芯…
  8. GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
  9. socket通信压力测试
  10. 小项目1——猫眼Top100 爬取
  11. Windows Internet Information Services(IIS) 与 inetpub 文件夹
  12. espanso-跨平台文本扩展工具
  13. 艾诗娜:红女巫 Ashina: The Red Witch Build.10280376 官方中文 免安装【209M】
  14. 没比这更简单的了!安装PHP composer(windows环境)及简易使用
  15. STVD 新建STM8L151工程
  16. 自学3D游戏建模,90%的人都过不了这一关
  17. android 恢复照片误删,安卓手机数据恢复:红米手机照片误删怎么恢复
  18. 邮政储蓄银行 软件开发 2020暑期实习 面试回忆
  19. JIT编译器里面的“逃逸分析”(Escape analysis)
  20. GO(单元)测试的基本规则和流程

热门文章

  1. Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译
  2. PAT1036:Boys vs Girls
  3. Linux必知必会的目录与启动过程
  4. cookie和session的代码实现
  5. VIM7.3添加中文帮助文档
  6. 【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布
  7. 技术图文:位运算技术在求解算法题中的应用
  8. 【怎样写代码】函数式编程 -- Lambda表达式(一):引出
  9. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
  10. 【MATLAB】交互式绘图(ginput,gtext,zoom)