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

互联网架构师

共 5201字,需浏览 11分钟

 · 2021-08-23

上一篇:深夜看了张一鸣的微博,让我越想越后怕

作者:废物大师兄

来源: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 repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true
[nginx-mainline]name=nginx mainline repobaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true

yum安装nginx

yum install nginx

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


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


为了启动nginx,直接在命令行里输入nginx回车即可
# 启动nginxnginx# fast shutdownnginx -s stop# graceful shutdownnginx -s quit# reloading the configuration filenginx -s reload# reopening the log filesnginx -s reopen# list of all running nginx processesps -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本意是镜子、镜像,这里可以理解就像一个镜像站点一样,将所有的请求都收集起来,这个镜像就代表了所有真实有效的原始请求。


有了这个镜像,后续我们才可能用这个镜像去做一些事情,比如重现一下所有的请求,这就实现了把线上的流程复制到别的地方。


搜索公众号互联网架构师后台回复“2T”,获取一份惊喜礼包。


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

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


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

    · END ·
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全


正文结束


推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

一个人学习、工作很迷茫?


点击「阅读原文」加入我们的小圈子!

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报