一个关于 nginx 的 mirror 的齐怪现象,有没有熟悉的大佬给指点下

43 天前
 mosliu

问题

使用 nginx 的 mirror 功能时,mirror 的服务器不能响应 mirror 的需求,但是 mirror 的请求再套一层 nginx 就又可以了。

架构基础情况

n 是 nginx 服务器 nginx 版本 v1.22.1 是通过 apt 安装的

a ,b 是跑着同样的 springboot 写的服务的服务器。

配置 n 的 nginx 转发到 a mirror 到 b

触发动作:向 n 的 nginx 请求

碰到一个奇怪的问题:

nginx 直接转发请求到 a a 正常响应

nginx 直接转发请求到 b b 正常响应

不开服务,同样使用 nc -lk 8881 会发现,a 和 b 接收到的信息除了 Host 是一样的。服务不对 host 有限制。

nginx 转发请求到 a 并 mirror 到 b a 正常 b 的服务不响应

nginx 转发请求到 b 并 mirror 到 a b 正常 a 的服务不响应

通过在 b 上 nc 转发 nc -l 8881 | tee >(nc localhost 8882) 可以观察到确实转发了,但是 b 无响应,A 同理

最神奇的是:当我想着记录下具体的日志。于是在 b 上在开一个 nginx 该 nginx 转到本机的 b 服务。

n mirror->b ningx-> b 这个时候,b 就正常了能接收请求了。

补充说明

在 springboot 服务中,我也写了 filter ,对所有的请求进行打印。会发现失败的时候根本没有打印输出。也就是没有检测到请求,可是 nginx 确实转发了。

但是 b 就是对 mirror 的请求无反应。

nginx 的配置

upstream backend {
        server 172.23.16.180:8881; 
}
upstream test_backend1 {
        server 172.23.16.182:8881;  # 8881 是服务的端口,8883 是 nginx 的端口。
}
server {
        listen 8881;        
        location / {
                mirror /mirror1;
                mirror_request_body on; # 加与不加一样
                proxy_pass http://backend;
        }
        location = /mirror1 {
                internal;
                proxy_pass_request_body on; # 请求是 POST 需要有这个
                proxy_pass http://test_backend1$request_uri;

        }
}        
1036 次点击
所在节点    NGINX
4 条回复
rrfeng
43 天前
mirror 只负责把请求发出去就结束了,不管它响应的。可能是发完直接关了连接导致后端没有响应。
抓包看一眼就知道了。
mosliu
43 天前
@rrfeng 这么想过 不过感觉不一定对为啥再套一层就没事了呢。。 奇怪在再套一层居然恢复了。
mosliu
43 天前
继续研究 添加了 `proxy_set_header Host $host;` 解决。
理论上是服务的问题。

但是 我没有做 host 过滤啊。

另外 这里两个后端 检查发现 直接转发的是`Host: backend` mirror 的是`Host: test_backend1`
没什么区别啊。。
而且又包了一层 nginx 就 ok 了 这就很迷。。。
yumusb
43 天前
wireshark 解君愁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1029386

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX