使用 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;
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.