• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

利用NGINX内置模块mirror进行流量复制等操作

Nginx eryajf 2周前 (10-05) 124°C 已收录 0个评论
本文预计阅读时间 8 分钟

在日常工作中,会有这样的场景,为了便于测试,可能希望线上的请求能够同步到测试一部分,以便于验证某些功能,或者是在多套测试环境的情况下,希望能够将某些请求在几个环境同步,比如在1环境测试的时候生成了某个图片或者视频,这个生成依赖于一个请求的回调,而如果没有特别配置,则这个请求就只在当前环境中生效,这对测试工作有相当大的不便。

于是,我们需要引入流量复制这一概念,流量复制有不少工具可以实现,有Gor、tcpreplay、tcpcopy 等,而今天将要使用的,是配置简单,使用方便的NGINX的一个模块:ngx_http_mirror_module

mirror: 中文为镜像的意思,这里指流量复制的目的地。

1,特性。

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

mirror 模块在 Nginx 1.13.4以后的版本中默认是启用的,只需看一下版本即可,不必重新编译。

2,简单配置。

先看下当前使用的NGINX版本:

$ nginx  -V

nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module

接着添加如下配置:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 8181;
        access_log /var/log/nginx/test.log;
        root html/test;
    }

    server {
        listen 8282;
        access_log /var/log/nginx/mir1.log;
        root html/mir1;
    }

    server {
        listen 8383;
        access_log /var/log/nginx/mir2.log;
        root html/mir2;
    }

    upstream backend {
        server 127.0.0.1:8181;
    }
    upstream test_backend1 {
        server 127.0.0.1:8282;
    }

    upstream test_backend2 {
        server 127.0.0.1:8383;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            mirror /mirror1;
            mirror /mirror2;
            proxy_pass http://backend;
        }

        location = /mirror1 {
            internal;
            proxy_pass http://test_backend1$request_uri;
        }

        location = /mirror2 {
            internal;
            proxy_pass http://test_backend2$request_uri;
        }
    }
}

说明:

location / {                        # location /指定了源uri为/,也可以定义为其他指定接口
    mirror /mirror1;                # mirror /mirror指定镜像uri为/mirror
    mirror /mirror2;                # 有多个需要复制流量的,可以配置多条
    mirror /mirror2;                # 配置多条情况下,将会起到流量放大的作用,即主配置请求一次,镜像端会有两次
  # mirror_request_body on;         # 指定是否镜像请求body部分,请求自动缓存;
    proxy_pass http://backend;      # 指定处理主流量的后端Server
}

location = /mirror1 {
    internal;       # 指定此location只能被“内部的”请求调用,外部的调用请求会返回”Not found” (404)
    proxy_pass http://test_backend1$request_uri;    # 指定将要复制流量的Server1
}

location = /mirror2 {
    internal;
    proxy_pass http://test_backend2$request_uri;
}

3,验证。

此时验证也非常简单,检测配置无误,然后启动NGINX,使用tail同时监听三个日志,然后请求127.0.0.1/index.html,会发现这一请求同时在日志中出现了。

创建一下访问内容:

$ cd /usr/local/nginx/html/
$ mkdir test mir1 mir2
$ echo test > test/index.html
$ echo mir1 > mir1/index.html
$ echo mir2 > mir2/index.html

$ curl 127.0.0.1/index.html

请求看效果:

参考:


weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明利用NGINX内置模块mirror进行流量复制等操作
喜欢 (0)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!

您必须 登录 才能发表评论!