Nginx 一个牛X的功能,流量拷贝!
作者:废物大师兄
链接: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的功能,流量拷贝!相关推荐
- Nginx 一个牛 X 的功能,流量拷贝!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | cnblogs.com/cjsblog/p/1 ...
- Nginx 又一牛X的功能!流量拷贝
「 读者福利!2 TB 各类技术资源免费赠送 」 1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证, ...
- nginx实现并发连接与IP流量限速功能
目录 参考 前言 limit_conn_zone 模块 配置 测试 测试小文件 测试大文件 总结 limit_request 模块 配置 测试 测试1 - 不加 burst 和 不加 nodelay ...
- 一个牛B程序员的奋斗
一个牛B程序员的奋斗 声明:此文为多年前的一位程序员所写,相信很多人都看过,许多新人很迷茫,那就看看此人是怎么奋斗的吧!希望此文能对广大程序员有所启发,共勉! 这些日子我一直在写一个实时操作系统内核, ...
- HTTP 流量拷贝测试神器 GoReplay
以下文章来源于 一个 程序员 的 修炼之路 ,作者 河边 一枝 柳 一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等.但是这些测试往往都是基于自己定义的测试数据集合,很可能会 ...
- HTTP流量拷贝测试神器GoReplay
一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等.但是这些测试往往都是基于自己定义的测试数据集合,很可能会有漏网之鱼,那么在软件上线之后,在线上的流量冲击下,会出现各种之前测 ...
- 一个牛逼的创业公司后台技术栈搭建方案
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:潘锦 本文转载自:架构与远方 技术经验交流:点击入群 说到后台技术栈,脑海中是不是浮 ...
- 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...
- 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...
玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...
最新文章
- 经典算法学习——直接选择排序
- python 之socket 网络编程
- EasyUI中Datebox日期框的简单使用
- 安装仅限于用于sharepoint_酒泉汗蒸房设计施工厂家,家庭汗蒸房安装厂家
- 线性代数---矩阵的各种问题求解方法
- python 获取点击按钮名称_python如何获取tkinter组件的名称?比如按下多个Button中的一个,返回这个被按下的Button的text?...
- 博通:NFC将成手机标配nbsp;新芯…
- GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
- socket通信压力测试
- 小项目1——猫眼Top100 爬取
- Windows Internet Information Services(IIS) 与 inetpub 文件夹
- espanso-跨平台文本扩展工具
- 艾诗娜:红女巫 Ashina: The Red Witch Build.10280376 官方中文 免安装【209M】
- 没比这更简单的了!安装PHP composer(windows环境)及简易使用
- STVD 新建STM8L151工程
- 自学3D游戏建模,90%的人都过不了这一关
- android 恢复照片误删,安卓手机数据恢复:红米手机照片误删怎么恢复
- 邮政储蓄银行 软件开发 2020暑期实习 面试回忆
- JIT编译器里面的“逃逸分析”(Escape analysis)
- GO(单元)测试的基本规则和流程
热门文章
- Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译
- PAT1036:Boys vs Girls
- Linux必知必会的目录与启动过程
- cookie和session的代码实现
- VIM7.3添加中文帮助文档
- 【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布
- 技术图文:位运算技术在求解算法题中的应用
- 【怎样写代码】函数式编程 -- Lambda表达式(一):引出
- 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
- 【MATLAB】交互式绘图(ginput,gtext,zoom)