文章主要总结两部分:
1. Nginx Mirror模块 复制流量并转发
2. Nginx 代理如何将ClientIP正确转发到下级服务
这里先看一段配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 匹配上报请求进行流量转发 location ~ /api/report { # 流量复制 mirror /mirror/report; mirror_request_body on; # 主流量地址 proxy_pass http://tkxiong.com; # 转发请求IP地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 非首层代理, 一直传递下去 proxy_set_header X-Real-IP $http_x_real_ip; # 首层代理, 写入真实IP地址 # proxy_set_header X-Real-IP $remote_addr; # 记录Report日志 access_log /data/log/nginx/access_report.log main; } # 上报镜像流量复制 location = /mirror/report { # 标志该location只为内部的重定向服务, 外面来的返回404 internal; # 使用域名需要配置DNS解析 resolver 8.8.8.8; # 转发地址, 流量复制会丢掉request_uri, 故显式指定 proxy_pass http://tkxiong-mirror.com$request_uri; proxy_pass_request_body on; proxy_set_header X-Original-URI $request_uri; # 转发请求IP地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 非首层代理, 一直传递下去 proxy_set_header X-Real-IP $http_x_real_ip; # 首层代理, 写入真实IP地址 # proxy_set_header X-Real-IP $remote_addr; } |
对于 /api/report 接口,复制一份 /mirror/report 流量
通过 proxy_pass 指定转发的地址
需要注意的是: Nginx 会丢弃 mirror 的响应
即: tkxiong-mirror.com 地址收到请求,发回的响应会被丢弃掉。
ClientIP 转发正确的IP地址
主要是 X-Forwarded-For 和 X-Real-IP 的正确传递
# 转发请求IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 非首层代理, 一直传递下去
proxy_set_header X-Real-IP $http_x_real_ip;
# 首层代理, 写入真实IP地址
# proxy_set_header X-Real-IP $remote_addr;
【Nginx】Mirror镜像流量转发 & 代理ClientIP转发