欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

Nginx实现流量拷贝的示例代码

2025年07月16日 Linux
1. 需求在生产环境中,我们经常需要将流量拷贝到预上线环境或测试环境,以便进行各种验证和测试。这样做的好处包括:功能验证与性能测试:通过真实流量测试新功能和服务的性能。数据真实性:无需造数据,使用真实

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

然后,使用yum安装nginx:

sudo yum install nginx

默认情况下,nginx的配置文件是nginx.conf,一般位于/etc/nginx目录下。启动nginx非常简单,只需在命令行中输入:

sudo nginx

一旦master进程接收到重新加载配置的信号,它将检查新配置文件的语法是否正确,并尝试应用新配置。如果成功,master进程将启动新的worker进程,并发送消息给旧的worker进程,要求它们关闭。否则,将回滚更改并继续使用旧配置。

停止nginx可以使用以下命令:

sudo nginx -s stop

nginx的master进程的进程id默认情况下存放在nginx.pid文件中,该文件一般位于/var/run目录下。

3. ngx_http_mirror_module

ngx_http_mirror_module模块(1.13.4版本引入)通过创建后台镜像子请求来实现原始请求的镜像。镜像子请求的响应会被忽略。

这里,“mirror”可以理解为像一个镜像站点一样,收集所有请求。有了这个镜像,后续可以用它重现所有请求,从而实现将线上流量复制到其他地方。

官网给出的示例非常简单:

location / {
    mirror /mirror;
}

如果请求体被镜像,那么在创建子请求之前会先读取请求体。

注意:通过yum安装的nginx可能不包含ngx_http_mirror_module模块。因此,真正使用时最好采用自定义安装,即从源码构建。

步骤

  1. 下载源码

  2. 编译安装

    • 解压源码并进入目录,执行配置、编译和安装命令。

以下是一个示例配置:

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

运行效果

假设我们有一个服务在127.0.0.1:8080上运行,并且我们在127.0.0.1:8081上有一个镜像服务。当我们访问http://your_nginx_server/api/some_endpoint时,请求将被镜像到/newapi/mirror2/mirror3指定的路径(这些路径可以是实际的服务路径,也可以是日志收集路径等)。

示例运行结果(假设通过日志查看):

  • 原始服务日志

    127.0.0.1 - - [12/oct/2023:12:34:56 +0000] "get /api/some_endpoint http/1.1" 200 123
    
  • 镜像服务日志(假设镜像到另一个服务并记录):

    127.0.0.1 - - [12/oct/2023:12:34:56 +0000] "get /tapi/some_endpoint http/1.1" 200 123 (mirrored from /api)
    

4. 补充命令

  • 查看进程运行时间

    ps -eo pid,user,lstart,etime,cmd | grep nginx
    
  • 查看已经建立连接的数量

    netstat -an | grep established | wc -l
    
  • 查看80端口的连接数

    netstat -an | grep ":80" | wc -l
    

通过以上步骤和配置,您可以轻松实现nginx的流量拷贝功能,为测试和验证提供强大支持。

到此这篇关于nginx实现流量拷贝的示例代码的文章就介绍到这了,更多相关nginx 流量拷贝内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!