首页

Nginx一大实用功能:流量复制

DevOps技术栈 2020快三预测-04-29 12:36

来源: 

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


1、需求

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

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

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

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

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

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


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


2、安装Nginx


使用yum安装nginx ,先配置官方源:vim /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 install nginx -y 

默认配置文件:/etc/nginx/nginx.conf

常用命令:

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

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

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.htmlhttp://nginx.org/en/docs/beginners_guide.htmlhttp://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.htmlhttps://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 -

推荐阅








年轻时偷的懒 ,迟早是要还的。点亮

本站根据用户申请收录文章 ,版权归原作者所有
如若侵权 ,请联系ershicimi@163.com删除