nginx的http流量拷贝

2022-02-05
1分钟阅读时长

在开发新的应用服务,为了做验证,调试等目的,又不想影响原有的应用服务,可以使用nginx的http流量拷贝,通过http的流量复制,在不影响原有路由的流量的基础上,方便调试

nginx流量拷贝配置参考

  1. 启动两个http服务,并且配置hosts文件,linux/mac os x 配置 /etc/hosts,windows下配置system32下的hosts文件 增加127.0.0.1 mirror.io
nc -l 1999 -k 
nc -l 2001 -k 
  1. 配置nginx服务

upstream mirror {
    server 127.0.0.1:2001;
}

#流量重放 https://www.cnblogs.com/kevingrace/p/14001080.html

server {
        listen 80;
        server_name abc.io;

        #ssl_protocols  SSLv2 SSLv3 TLSv1.2;
        #ssl_ciphers  HIGH:!aNULL:!MD5;
        #ssl_prefer_server_ciphers   on;
          location / {
                proxy_pass http://localhost:1999/;
                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 /mirror;
                # 多加一个mirror,流量多复制一次
                mirror /mirror;
                mirror_request_body on;
         
                      
               

        }

        location /mirror {

                #可以限制POST不拷贝呗
                if ($request_method != GET) {
                    return 403;
                }
                access_log  access_mirror.log  main;
                internal; # 内部配置
                proxy_pass http://mirror$request_uri;
                proxy_pass_request_body on;
                #使用真实的url重置url
                proxy_set_header X-Original-URI $request_uri; 
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

  }
3. 执行测试,会看到两个nc监听的http服务,收到同样的GET请求
```bash
curl http://abc.io

镜像配置最佳实践

配置方法如如上"配置mirror镜像日志"。部分错误配置的错误信息在在error日志中。

nginx的http流量复制的FAQ

代理或者流量拷贝,注意content-length的设置 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的大小,若mirror_request_body或者proxy_pass_request_body设置为off,应用以为post有内容,当request_body中没有,处理方会一直等待至超时,则前者为off,nginx会报upstream请求超时·