1、简介
Nginx自 1.13.4 开始引入 nginx_mirror_module 模块,利用此模块可以将线上实时流量镜像至其他环境,而Nginx最终 会丢弃 mirror 的响应,从而不影响源站请求的响应。
2、配置
upstream backend {
server backend.server:10000;
}
upstream test_backend {
server test.server:20000;
}
server {
server_name proxy.local;
listen 8000;
location / {
mirror /mirror;
proxy_pass http://backend;
}
location = /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}
}
# 按百分比镜像
upstream backend {
server backend.server:10000;
}
upstream test_backend {
server test.server:20000;
}
split_clients "ADDR${remote_addr}TIME${date_gmt}" $mirror_backend {
50% mirror;
* "";
}
server {
server_name proxy.local;
listen 8000;
location / {
if ($mirror_backend = "mirror") {
mirror /mirror;
}
proxy_pass http://backend;
}
location = /mirror
{
internal;
proxy_pass http://test_backend$request_uri;
}
}
3、多倍复制。 有几个mirror指令,就是复制几倍。如下面的例子,原始的1个请求会向mirror端发送2个请求。 可以用压力测试
location / {
mirror /mirror;
mirror /mirror;
proxy_pass http://backend;
}
nginx会对第二个参数进行MurmurHash2计算,会得到1个32位的hash值,值范围在前50%的,会将$mirror_backend 赋值为mirror,后50%会赋值为空。通过判断变量$mirror_backend的值,来确定是否镜像请求。
4、注意事项
经测试mirror端响应异常和端口关闭(主机在,进程关闭) 都不会影响线上服务。但是mirror端响应变慢会拖慢线上的请求,导致影响线上的服务。针对这个问题,有两个改善的方法:
1、 部分镜像
2、在mirror location里设置proxy_connect_timeout、proxy_read_timeout 超时时间。如:
location = /mirror {
internal;
proxy_pass
http://mirror$request_uri;
proxy_connect_timeout 200ms; #参考镜像项目的响应时间来确定具体的值
proxy_read_timeout 200ms;
}
标签:pass,location,流量,server,Nginx,复制,proxy,mirror,backend
From: https://blog.51cto.com/zzzhao/6223711