nginx+goreplay实现业务流量压测的示例代码

 更新时间:2025年07月16日 10:40:00   作者:alden_ygq  
通过Nginx和GoReplay的组合,可以实现生产环境流量的实时拷贝和回放,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

结合 Nginx 和 GoReplay 可以实现生产环境流量的实时拷贝和回放,这在测试、性能验证和问题复现场景中非常有用。以下是具体实现方案:

一、核心原理

1)Nginx 流量镜像(Mirroring)

  • 使用 ngx_http_mirror_module 将生产环境的请求复制到指定地址(如本地端口或其他服务器),而不影响原始请求的处理。
  • 镜像请求的响应会被 Nginx 丢弃,不返回给客户端。

2)GoReplay 接收并处理流量

GoReplay 监听 Nginx 镜像的端口,捕获请求并可以:

  • 实时转发:将流量转发到测试环境或压测服务器。
  • 保存为文件:记录流量用于后续回放。
  • 实时分析:统计请求分布、响应时间等指标。

二、实现步骤

1. 配置 Nginx 流量镜像

修改 Nginx 配置文件(如 nginx.conf 或站点配置),添加 mirror 指令:

server {
    listen 80;
    server_name example.com;

    location / {
        # 处理正常请求
        proxy_pass http://backend_production;
        
        # 镜像请求到本地 8080 端口(由 GoReplay 监听)
        mirror /mirror;
        mirror_request_body on;  # 镜像请求体
    }

    # 镜像请求的目标位置
    location /mirror {
        internal;  # 禁止外部访问
        proxy_pass http://127.0.0.1:8080$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        # 可添加更多请求头
    }
}

2. 安装并启动 GoReplay

下载并启动 GoReplay,监听 Nginx 镜像的端口(如 8080):

# 下载 GoReplay
wget https://github.com/buger/goreplay/releases/download/v1.3.1/gor_1.3.1_x64.tar.gz
tar xzf gor_1.3.1_x64.tar.gz
chmod +x gor

# 模式1:实时转发到测试环境
./gor --input-raw :8080 --output-http "http://test-server:80"

# 模式2:保存流量到文件
./gor --input-raw :8080 --output-file "traffic.gor"

# 模式3:同时转发和保存
./gor --input-raw :8080 --output-http "http://test-server:80" --output-file "traffic.gor"

3. 流量回放(可选)

使用保存的流量文件(traffic.gor)进行回放:

# 回放流量到测试环境,模拟 100 并发
./gor --input-file "traffic.gor" --output-http "http://test-server:80" --http-track-response --workers 100

三、关键配置参数

Nginx 参数

  • mirror /mirror:指定镜像请求的目标位置。
  • mirror_request_body on:启用请求体镜像(默认不镜像请求体)。
  • internal:确保镜像目标位置不接受外部请求。

GoReplay 参数

  • 输入选项:
    • --input-raw :8080:监听本地 8080 端口的原始流量。
    • --input-file "traffic.gor":从文件读取流量。
  • 输出选项:
    • --output-http "http://test-server:80":转发到目标服务器。
    • --output-file "traffic.gor":保存流量到文件。
    • --output-statsd "statsd:8125":发送统计数据到 StatsD。
  • 性能选项:
    • --http-allow-url ".*":过滤允许的 URL 模式。
    • --http-allow-header "X-Test: true":过滤特定请求头。
    • --workers 100:设置并发工作线程数。

四、注意事项与优化

1. 性能影响

  • Nginx 开销:镜像请求会增加 CPU 和网络开销(通常 <5%,取决于请求大小)。
  • GoReplay 资源占用:建议部署在独立服务器或容器中,避免影响生产环境。

2. 请求过滤

  • 只镜像关键路径的请求(如 API 接口),避免静态资源(如图片、CSS):
    location ~ ^/(api|users|orders) {
        mirror /mirror;
    }
    

3. 安全与隐私

  • 敏感数据(如密码、信用卡号)需过滤:
    # GoReplay 过滤请求体中的敏感字段
    ./gor --input-raw :8080 --output-http "http://test-server:80" --http-body-filter "s/credit_card=[0-9]+/credit_card=*** /g"
    

4. 测试环境准备

  • 确保测试环境能承受流量压力,避免被压垮。
  • 使用 --http-track-response 参数跟踪回放的响应结果,分析成功率。

五、验证与监控

1. 验证流量镜像

  • 在测试服务器查看访问日志,确认是否收到镜像的请求。
  • 使用 GoReplay 的统计功能查看流量指标:
    ./gor --input-raw :8080 --output-stdout --stats
    

2. 监控性能

  • 监控 Nginx 和 GoReplay 的 CPU / 内存使用情况。
  • 使用 Prometheus + Grafana 收集 GoReplay 输出的指标(如请求数、响应时间)。

六、典型场景

  • 灰度测试:将生产流量部分转发到新版本服务,验证兼容性。
  • 性能压测:使用真实流量对新部署的服务进行压力测试。
  • 问题复现:捕获故障时段的流量,在测试环境中复现问题。

通过 Nginx 和 GoReplay 的组合,可低成本实现生产流量的复制和回放,大幅提升测试效率和问题定位能力。

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

相关文章

  • Nginx设置HTTPS的方法步骤

    Nginx设置HTTPS的方法步骤

    本文主要介绍了NGINX设置HTTPS的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • nginx修改上传文件大小限制的方法

    nginx修改上传文件大小限制的方法

    本篇文章主要介绍了nginx修改上传文件大小限制的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • Nginx的流式响应配置教程

    Nginx的流式响应配置教程

    Nginx的流式响应是指反向代理服务器在接收到响应的同时逐步发送给客户端,以提高用户体验和网络传输效率,通过配置关闭缓存和代理缓冲、开启分块传输编码、禁用Nagle与延迟ACK算法,并增加keepalive超时时间,可以实现代理服务器与客户端间的流式响应传输
    2024-11-11
  • nginx实现动静分离实例讲解

    nginx实现动静分离实例讲解

    在本篇文章里小编给大家整理的是关于nginx实现动静分离实例讲解,需要的朋友们可以参考下。
    2020-03-03
  • Nginx 域名SSL证书配置(网站 http 升级为 https)

    Nginx 域名SSL证书配置(网站 http 升级为 https)

    这篇文章主要介绍了Nginx 域名SSL证书配置(网站 http 升级为 https),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • nginx proxy_buffer_size解决后端服务传输数据过多,header过大问题

    nginx proxy_buffer_size解决后端服务传输数据过多,header过大问题

    这篇文章主要介绍了nginx proxy_buffer_size解决后端服务传输数据过多,header过大问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • nginx实现重写功能和防盗链功能

    nginx实现重写功能和防盗链功能

    这篇文章主要介绍了nginx实现重写功能和防盗链功能,Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,防盗链基于客户端携带的referer实现,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • nginx如何设置禁止访问PHP脚本

    nginx如何设置禁止访问PHP脚本

    禁止访问 PHP 脚本可以通过 Nginx 服务器配置中的多种方式来实现,这篇文章主要为大家整理了一些常见的方法,感兴趣的小伙伴可以参考下
    2023-09-09
  • 本地通过nginx配置反向代理的全过程记录

    本地通过nginx配置反向代理的全过程记录

    这篇文章主要给大家介绍了关于本地通过nginx配置反向代理的全过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Nginx反向代理的location路径映射方式

    Nginx反向代理的location路径映射方式

    这篇文章主要介绍了Nginx反向代理的location路径映射方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论