在使用Nginx反向代理Frp时,通过HTTPS访问报“502 Bad Gateway”
首先给出解决办法:
第一种是将frp中映射的https类型修改为tcp类型,然后nginx反代时,填写https://127.0.0.1:映射的TCP端口。
比如要映射的内网服务器上面的HTTPS服务,但是直接配置HTTPS类型的映射后Nginx反代会提示“502 Bad Gateway”,此时将映射类型修改为TCP即可,需要注意的是,tcp类型的映射需要填写外部端口,而在nginx的反向代理配置中也学要填写的映射的外部端口。
第二种是使用http映射,然后nginx反向代理https到http。
分析:
最开始我判断是nginx的问题,因为使用frp映射后,通过映射的端口是可以直接访问的。查看nginx后发现报以下错误:
2020/07/08 11:06:36 [error] 22845#0: *3 peer closed connection in SSL handshake while SSL handshaking to upstream, client: xx.xx.xx.xx, server: xxx.xxx.xxx, request: "GET / HTTP/2.0", upstream: "https://127.0.0.1:4433/", host: "xxx.xxx.xxx"
搜索后判断可能是证书或者域名的问题,但是反复检查证书和反向代理host配置后没有发现问题,并测试了其它域名https反向代理正常(nginx到.net core web服务)。然后我估计是frp出现问题,于是查看frp日志。
frps[1153]: 2020/07/08 11:13:20 [W] [vhost.go:139] get hostname from http/https request error: Unknow error
看到frp无法获取hostname??此时我就比较纳闷了,在nginx反代时,传递了hostname,frp还无法获取?反正这个时候是懵逼了的,经历了各种折腾无果。最后突然想到,https走的是tcp协议,直接反代tcp协议是否可行。遂把映射类型修改为tcp,测试后居然可以正常访问。
个人估计是https加密了host信息,frp无法获取?但是hostname nginx是传递给了frp了呀?由于没有深入研究过nginx和frp,也只能做简单的分析。
文章评论