本文介绍了一种规避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证书
- Source:
- Proxy Hosts:
- 公网IP:xxx,域名
- 服务器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证书
- Source:
- Proxy Hosts:
- Jellyfin:8096端口,http协议
- 内网IP:
访问尝试及分析
首先,在内网中,直接使用http://192.168.0.2:8096
是可以直接访问,使用https://jellyfin.sample.com
访问也是可以的,因为部署了本地DNS劫持,能正确解析到192.168.0.2
,并且同时浏览器也不存在不安全提示,https所需的证书齐全。
但在外网中,使用https://jellyfin.sample.com
访问,却出现了502 Bad Gateway
,这是因为什么原因呢?
通过查看访问日志,有如下发现:
jellyfin.sample.com
域名是成功解析到了服务器A
的,并且满足https需求;服务器A
的NPM反向代理是运行正常的,将访问反代到了服务器B
;服务器B
的NPM反向代理是运行正常的,成功收到了来自服务器A
的请求,但是抛出了502 Bad Gateway
;
至此,华点初现,服务器B
并没有处理来自服务器A
的请求,研究服务器B的日志,其中有收到了来自192.168.0.1
对https://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 许可协议。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
Comments NOTHING