Nginx Proxy Manager 多重反向代理

Yamako 发布于 2024-12-10 138 次阅读


本文介绍了一种规避NPM多重反向代理时502 Bad Gateway 的规避方法。

动机

由于某些特殊原因,也有可能是一定程度减轻部署压力,主动或是被动进行多重反向代理,即将对于服务器A的访问反向代理到服务器B后,再一次反向代理到服务器C或是具体服务。

我们先暂且不讨论这样的效率问题

而常用的反向代理服务部署通常是Nginx Proxy Manager(NPM),可以通过Docker快速部署,且有友好的图形化管理界面,以及SSL证书管理功能。

但是在本人尝试使用NPM进行多重反向代理时,遭遇了502 Bad Gateway的问题。

本文将用于讲解问题产生原因以及如何解决。

问题分析

示例环境

为了便于后续讲解,我们先假设一个环境,用于访问一个jellyfin服务:

  • 域名:jellyfin.sample.com
  • 服务器A:
    • 公网IP:xxx,域名jellyfin.sample.com解析后所指
    • 内网IP:192.168.0.1
    • NPM:443端口
      • Proxy Hosts:
        • Source:*.sample.com
        • Destination:https://192.168.0.2:443
        • 部署了一个泛域名*.sample.com的SSL证书
  • 服务器B:
    • 内网IP:192.168.0.2,内网DNS劫持*.sample.com解析后所指
    • NPM:443端口
      • Proxy Hosts:
        • Source:jellyfin.sample.com
        • Destination:http://127.0.0.1:8096
        • 部署了一个泛域名*.sample.com的SSL证书
    • Jellyfin:8096端口,http协议

访问尝试及分析

首先,在内网中,直接使用http://192.168.0.2:8096是可以直接访问,使用https://jellyfin.sample.com 访问也是可以的,因为部署了本地DNS劫持,能正确解析到192.168.0.2 ,并且同时浏览器也不存在不安全提示,https所需的证书齐全。

但在外网中,使用https://jellyfin.sample.com 访问,却出现了502 Bad Gateway ,这是因为什么原因呢?

通过查看访问日志,有如下发现:

  1. jellyfin.sample.com域名是成功解析到了服务器A的,并且满足https需求;
  2. 服务器A的NPM反向代理是运行正常的,将访问反代到了服务器B
  3. 服务器B的NPM反向代理是运行正常的,成功收到了来自服务器A的请求,但是抛出了502 Bad Gateway

至此,华点初现,服务器B并没有处理来自服务器A的请求,研究服务器B的日志,其中有收到了来自192.168.0.1https://192.168.0.2:443 的请求。简单思考,感觉这并没有问题,似乎确实是理所应当的。

但是这个理所应当是对于单个NPM反向代理而言的,在多重代理中,https://192.168.0.2:443 并不是这个访问的终点,对于服务器B上的NPM而言,其根本不知道https://192.168.0.2:443 需要指向的下一个服务,所以抛出了502 Bad Gateway

进一步探究,再服务器B上进行抓包,分析来自服务器A的数据包,发现数据包头部的SNI缺失,即服务器A的NPM在进行反向代理时丢弃了请求的Host关键字。

而这一影响不仅会出现在当前这种多重代理时出现502 Bad Gateway ,也有可能造成某些对所使用的Host 进行访问高度敏感的服务(例如NextCloud)产生SSL验证不信任问题。

问题解决

要让Host 这一关键字能够有效的在多重反向代理中能够传播,只需要在NPM的Edit Proxy Host中进行Advanced 设置。

Custom Nginx Configuration 中添加下方代码:

proxy_set_header Host $host;
proxy_ssl_server_name on;
proxy_ssl_name $host;

例如,在本文的示例中,仅需要在服务器A的NPM对*.sample.com 的代理增加相关设置,即可在公网通过https://jellyfin.sample.com 访问部署在服务器B的jellyfin服务。

任何基于Nginx所进行的反向代理出现相关问题也是同理,仅需在.conf 文件中增加设置。

本文作者: Yamako

本文链接: https://tamayama.xyz/2024/12/10/nginx-proxy-manager-多重反向代理/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。