首页 > 系统相关 >[转帖]Nginx流量拷贝 - 运维笔记

[转帖]Nginx流量拷贝 - 运维笔记

时间:2024-05-09 09:05:19浏览次数:28  
标签:http 运维 pass request 转帖 Nginx proxy mirror kevin

https://www.cnblogs.com/kevingrace/p/14001080.html

 

一、Nginx的ngx_http_mirror_module模块实现流量复制介绍

Nginx专门提供了ngx_http_mirror_module模块,用来实现流量拷贝。将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处:

  • 可以验证功能是否正常,以及服务的性能;
  • 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问;
  • 相比于灰度发布,镜像流量不会影响真实流量;
  • 可以用来排查线上问题;
  • 重构,假如服务做了重构,这也是一种测试方式;

ngx_http_mirror_module模块就像是一个镜像站点一样,将所有的请求都收集起来,这个镜像站点就代表了所有真实有效的原始请求。有了这个镜像站点,后续就可以复现所有的请求,实现把线上的流程复制到别的地方。

ngx_http_mirror_module模块特性:

  • nginx 1.13.4及后续版本内置ngx_http_mirror_module模块,提供流量镜像(复制)的功能。
  • 支持流量放大,做法为:配置多份相同镜像。
  • 相比tcp-copy的优势:无需录制流量,实时可用;配置相当简单。
  • 源站请求,直接原路返回;正常配置下,mirror请求不影响源站请求及响应,源站nginx-server将流量复制到mirror站后,两者不再有任何交集。

二、Nginx编译安装,要加上ngx_http_mirror_module模块

下面是Nginx解压后,编译安装的示例

1 2 3 4 5 6 7 8 9 10 11 12 13 # ./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

三、Nginx流量拷贝的配置示例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 upstream kevin-order {   server 127.0.0.1:8088; }   upstream kevin-customer {   server 127.0.0.1:8089; }   upstream kevin-mirror1 {     server 172.16.60.230:8088; }   upstream kevin-mirror2 {     server 172.16.60.230:8089; }   server {     listen 80;     server_name  kevin.com;     access_log  /usr/local/nginx/logs/kevin.com-access.log main;     error_log   /usr/local/nginx/logs/kevin.com-error.log;     # 源站点1     location /order {         proxy_pass http://kevin-order;         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_request_body on;         # 流量复制         mirror /mirror1;     }       # 源站点2     location /customer {         proxy_pass http://kevin-customer;         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_request_body on;         mirror /mirror2;     }       # 镜像站点1     location /mirror1 {         proxy_pass http://kevin-mirror1$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;     }       # 镜像站点2     location /mirror2 {         proxy_pass http://kevin-mirror2$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;     } }

配置说明:上面配置中,将访问http://kevin.com/order、http://kevin.com/customer的流量分别复制到172.16.60.230服务器的8088和8089端口。

四、Nginx使用ngx_http_mirror_module模块进行流量拷贝的配置技巧

1)Nginx复制GET及POST请求流量

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 server {         listen       80;         server_name  kevin.com;         # 源站配置         location / {                 access_log  /usr/local/nginx/logs/access.log  accesslog;                 mirror /mirror;                 mirror_request_body on;                 proxy_pass http://kevin.upstream.name;         }         # 镜像站点配置         location /mirror {                 internal; # 内部配置                 proxy_pass http://mirror.kevin.upstream.name$request_uri;                 proxy_pass_request_body on;                 proxy_set_header X-Original-URI $request_uri; #使用真实的url重置url         } }

2)Nginx不允许复制POST请求流量
默认是支持POST流量复制的,需要通过下面配置来禁止。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 server {         listen       80;         server_name  kevin.com;           # 源站配置         location / {                 access_log  /usr/local/nginx/logs/access.log  accesslog;                 mirror /mirror;                 mirror_request_body off;                 proxy_pass http://kevin.upstream.name;         }           # 镜像站点配置         location /mirror {                 # 判断请求方法,不是GET返回403                 if ($request_method != GET) {                     return 403;                 }                 internal;  #内部配置                 proxy_pass http://mirror.kevin.upstream.name$request_uri;                 proxy_pass_request_body off;                 # mirror_request_body和proxy_pass_request_body都设置为off,则Conten-length需要设置为"",否则有坑!                 proxy_set_header Content-Length "";                 proxy_set_header X-Original-URI $request_uri; # 使用真实的url重置url         } }

3)拷贝流量放大
配置多分mirror镜像点

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 server {         listen       80;         server_name  kevin.com;         # 源站配置         location / {                 access_log  /usr/local/nginx/logs/access.log  accesslog;                 mirror /mirror;                 # 多加一份mirror,流量放大一倍                 mirror /mirror;                 mirror_request_body on;                 proxy_pass http://kevin.upstream.name;         }         # 镜像站点配置         location /mirror {                 internal; # 内部配置                 proxy_pass http://mirror.kevin.upstream.name$request_uri;                 proxy_pass_request_body on;                 proxy_set_header X-Original-URI $request_uri;  #使用真实的url重置url         } }

4)配置mirror镜像日志
mirror中不支持配置access_log,解决方法:mirror-location跳转到server,在server中配置accesslog。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 server {         listen       80;         server_name  kevin.com;         # 源站配置         location / {                 access_log  /usr/local/nginx/logs/access.log  accesslog;                 mirror /mirror;                 mirror_request_body on;                 proxy_pass http://kevin.upstream.name;         }         # 镜像站点配置         location /mirror {                 internal; # 内部配置                 # 跳转到下面的内部server                 proxy_pass http://127.0.0.1:10992$request_uri;                 proxy_pass_request_body off;                 proxy_set_header Content-Length "";                 proxy_set_header X-Original-URI $request_uri; #使用真实的url重置url         }   server {     # server没法设置为内部     listen 127.0.0.1:10992;     location / {         # 判断放在server,使得post请求日志可以记录         if ($request_method != GET) {             return 403;         }         access_log /usr/local/nginx/logs/access.log accesslog;         proxy_pass http://mirror.kevin.upstream.name;     }   }

五、Nginx流量拷贝的注意事项

1)mirror镜像配置日志
镜像配置不正确,导致流量复制操作没正常执行。如果mirror镜像配置缺少日志,会严重影响调试。所以强烈建议配置镜像日志,配置方法如如上"配置mirror镜像日志"。部分错误配置的错误信息在在error日志中。

2)mirror_request_body/proxy_pass_request_body与Content-Length需配置一致
如果mirror_request_body或者proxy_pass_request_body设置为off,则Content-Length必须设置为"",因为nginx(mirror_request_body)或tomcat(mirror_request_body)处理post请求时,会根据Content-Length获取请求体,如果Content-Length不为空,而由于mirror_request_body或者proxy_pass_request_body设置为off,处理方以为post有内容,当request_body中没有,处理方会一直等待至超时,则前者为off,nginx会报upstream请求超时;后者为off,tomcat会报如下错误:

1 2 3 4 5 6 7 8 9 10 11 "2020-11-18T17:26:36.803+08:00" "331632b86ec64b829672066a96fc6324"      "department"        "group"   "project_name"        "hostname"    "127.0.0.1"     ""      "/post" "p=11"  "-"     "PostmanRuntime/7.1.1"  "ERROR" "xxx.GlobalControllerAdvice"       "operateExp"    "-"     "26"    "xxxx.GlobalControllerAdvice"       "unknown"       "org.springframework.http.converter.HttpMessageNotReadableException"    "I/O error while reading input message; nested exception is java.net.SocketTimeoutException"    "GlobalControllerAdvice中捕获全局异常"  "org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.net.SocketTimeoutException         at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:229)         at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:150)         at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)         at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)         at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)         at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)         at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)         at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)         at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)         at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************

标签:http,运维,pass,request,转帖,Nginx,proxy,mirror,kevin
From: https://www.cnblogs.com/jinanxiaolaohu/p/15737646.html

相关文章

  • 如何降低系统运维成本
    自动化:运维成本控制的基石自动化是降低运维成本的第一步。通过将重复性高、标准化的任务自动化,企业能够显著减少人力投入,降低错误率,同时提升运维效率。1.自动化部署与配置管理: 使用诸如Ansible、Terraform等自动化配置管理工具,企业可以实现基础设施即代码(IaC),自动化完成服务器......
  • NGINX配置记录
    ####NGINX配置记录server{listen80;server_namewww.222.com;charsetutf-8;#roothtml/222/wap/dist;#location/robots.txt{#301重定向#return301http://www.333.com;if($time_iso8601~"(\d{4})-(\d{2})-(\d{2})"......
  • Nginx
    Nginx是一款开源的高性能HTTP服务器和反向代理服务器,用于处理静态内容,维护持久连接,以及提供第七层负载均衡器支持。以下是Nginx的一些主要特性:静态内容服务:Nginx可以处理静态内容,如HTML,图片,CSS,JavaScript等。反向代理:Nginx可以作为代理服务器接收客户端请求,并将请求转发......
  • [转帖]CPUpower的处理
    用cpupower工具修改,但是在修改过程中会遇到ERROR:[root@wyx~]#cpupowerfrequency-set-f1.6GSettingcpu:0Errorsettingnewvalues.Commonerrors:-Doyouhaveproperadministrationrights?(super-user?)-Isthegovernoryourequestedavailableandmodprobe......
  • Linux系统下安装配置 Nginx
    一、下载下载地址:点击跳转有条件的可以直接下载:wget-chttp://nginx.org/download/nginx-1.26.0.tar.gz二、安装解压安装包tar-zxvfnginx-1.26.0.tar.gz移动位置一般安装在usr/local下mvnginx-1.26.0/usr/local/nginx进入nginx目录执行配置脚本cd/usr/local/ng......
  • Nginx代理设置
    Nginx代理设置需求只有一个服务器,但是有多个应用在不同端口,需要通过域名或ip加路径的组合实现访问,不能是ip:port这样来访问工具NginxsudoaptinstallnginxNginx配置先上配置,配置文件位置:/etc/nginx/nginx.conf#找到http部分http{ ..........省略部分默认配置 inc......
  • Nginx配置中文详解
    Nginx配置文件nginx.conf中文详解参考:Nginx入门指南https://www.w3cschool.cn/nginx/######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组userwwwwww;#nginx进程数,建议设置为等于CPU总核心数。worker_processes8;#全局错误日志定义类......
  • 为何实战运维经验是开发工程师不可或缺的 “秘密武器”
    在这个数字化转型全速前进的时代,运维开发工程师(SRE/DevOpsEngineer)的角色愈发关键,他们既是软件开发的高手,也是系统运维的行家里手。但为何说,即便是专攻开发的他们,也需要深厚的运维经验作为支撑呢?本文将深入探讨这一问题,揭示运维经验如何成为运维开发工程师手中的“秘密武器”。......
  • nginx在docker中 清理
    killall-9nginx lsof-iTCP-sTCP:LISTEN-P|grep:80 yuminstallpsmisc-y sudoss-tunlp|grep:8517 ll/proc/65844/cwd查找并停止占用端口的进程:使用以下命令找出哪个进程正在监听这些端口:sudolsof-i:80sudolsof-i:443或者使用netstat:sudone......
  • 数字化运维体系:重塑IT运维的未来面貌
    随着信息技术的飞速发展,传统运维模式已难以满足现代企业日益增长的复杂需求。在此背景下数字化运维体系应运而生,以其独特的视角和方法论为IT运维领域带来了革新性的变革。本文将深入探讨数字化运维体系的定义、核心要素,并阐述如何通过这一体系实现IT资源的高效管理与优化。 数......