nginx流量拷贝功能介绍

发布时间 - 2021-03-12 00:00:00    点击率:

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进程退出。

(免费学习视频分享:php视频教程)

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;
    }
}

相关推荐:nginx教程


# nginx  # 镜像  # 线上  # 配置文件  # 重构  # 情况下  # 我是  # 是一种  # 放在  # 就像  # 还可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建高效可靠的建站解决方案?  如何在腾讯云免费申请建站?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  教学论文网站制作软件有哪些,写论文用什么软件 ?  5种Android数据存储方式汇总  Laravel如何创建自定义Artisan命令?(代码示例)  如何在IIS管理器中快速创建并配置网站?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Linux网络带宽限制_tc配置实践解析【教程】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  原生JS获取元素集合的子元素宽度实例  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  微信推文制作网站有哪些,怎么做微信推文,急?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在建站主机中优化服务器配置?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  利用vue写todolist单页应用  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何解决hover在ie6中的兼容性问题  如何用AI帮你把自己的生活经历写成一个有趣的故事?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何用wdcp快速搭建高效网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Swift中循环语句中的转移语句 break 和 continue  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何登录建站主机?访问步骤全解析  香港服务器选型指南:免备案配置与高效建站方案解析  在线教育网站制作平台,山西立德教育官网?  Laravel如何为API生成Swagger或OpenAPI文档  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  C语言设计一个闪闪的圣诞树  浅谈javascript alert和confirm的美化