使用 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 的请求无反应。
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;
}
}
1
rrfeng 237 天前 via Android
mirror 只负责把请求发出去就结束了,不管它响应的。可能是发完直接关了连接导致后端没有响应。
抓包看一眼就知道了。 |
3
mosliu OP 继续研究 添加了 `proxy_set_header Host $host;` 解决。
理论上是服务的问题。 但是 我没有做 host 过滤啊。 另外 这里两个后端 检查发现 直接转发的是`Host: backend` mirror 的是`Host: test_backend1` 没什么区别啊。。 而且又包了一层 nginx 就 ok 了 这就很迷。。。 |
4
yumusb 237 天前
wireshark 解君愁
|