在开发新的应用服务,为了做验证,调试等目的,又不想影响原有的应用服务,可以使用nginx的http流量拷贝,通过http的流量复制,在不影响原有路由的流量的基础上,方便调试
nginx流量拷贝配置参考
- 启动两个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
- 配置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请求超时·