问题
使用 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;
}
}