V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
mosliu
V2EX  ›  NGINX

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

  •  
  •   mosliu ·
    mosliu · 26 天前 · 935 次点击

    问题

    使用 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;
    
            }
    }        
    
    4 条回复    2024-04-03 14:13:24 +08:00
    rrfeng
        1
    rrfeng  
       26 天前 via Android
    mirror 只负责把请求发出去就结束了,不管它响应的。可能是发完直接关了连接导致后端没有响应。
    抓包看一眼就知道了。
    mosliu
        2
    mosliu  
    OP
       26 天前
    @rrfeng 这么想过 不过感觉不一定对为啥再套一层就没事了呢。。 奇怪在再套一层居然恢复了。
    mosliu
        3
    mosliu  
    OP
       26 天前
    继续研究 添加了 `proxy_set_header Host $host;` 解决。
    理论上是服务的问题。

    但是 我没有做 host 过滤啊。

    另外 这里两个后端 检查发现 直接转发的是`Host: backend` mirror 的是`Host: test_backend1`
    没什么区别啊。。
    而且又包了一层 nginx 就 ok 了 这就很迷。。。
    yumusb
        4
    yumusb  
       26 天前
    wireshark 解君愁
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1003 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:32 · PVG 06:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.