我有一个位于 Nginx 反向代理后面的应用程序,我正尝试从外部客户端访问它。客户端和应用程序都只支持 http。因此,我在客户端使用 Stunnel 将 http 映射到 https,在服务器端使用 nginix 将 https 映射回 http,以供应用程序(托管在另一台服务器上)使用。Web 浏览器访问按预期工作。也就是说,Web 浏览器可以以 https 形式访问 http 服务器资源。但是,Stunnel 客户端失败,Nginx 日志中显示以下内容:
/usr/share/nginx/html/r3/metadata" failed (2: No such file or directory), client: x.x.x.x, server: _, request: "GET /r3/metadata HTTP/1.1", host: "127.0.0.1:9080"
我的 Nginix 配置如下:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://192.168.1.2:9080/;
#proxy_redirect http:// https://;
}
和隧道
verify = 0
debug = 7
foreground = yes
[MyApp]
client = yes
accept = 127.0.0.1:9080
connect = foo.bar.com:443
Stunnel 日志没有显示哪里出了问题。似乎出于某种原因,Nginx 服务器正在本地服务器(即其本身)中查找资源,而不是内部应用程序服务器 - 但这只发生在远程客户端上的 Stunnel 中 - 而不是 Web 浏览器上。
答案1
以防其他人偶然发现这个模糊的问题。
问题: Mirth 集成引擎社区版本仅支持 FHIR 的 http,不支持 https。Stunnel 是解决此问题的明显选择。在源服务器和目标服务器上安装 Stunnel,并通过安全隧道将 http 映射到 https。但是,如果我们希望客户端 Mirth 实例访问 Nginx 反向代理,Stunnel 无法开箱即用地正常运行。为了澄清问题,请考虑以下 Stunnel 配置:
[mirth]
client = yes
accept = 127.0.0.1:9080
connect = host.foo.bar:443
但是,如果 Mirth 将 FHIR 客户端连接到 localhost,然后将其映射到 host.foo.bar,则只有“localhost”主机名会在 https 请求中转发到 host.foo.bar 服务器。这对于反向代理来说是一个问题,因为它会尝试将虚拟主机转发为“localhost”,而不是我们的内部 Mirth 服务器和端口。
解决方案: 解决方案很酷。有很多 DNS 服务器可以从主机名返回嵌入的 IP 地址。例如,查找主机“host.127.0.0.1.xip.io”将返回“127.0.0.1”。这很有用,因为我们现在可以告诉 Mirth 客户端连接到 host.127.0.0.1.xip.io。Stunnel 会将其视为 127.0.0.1,但我们的 Nginx 反向代理会将其读取为 host.127.0.0.1.xip.io,并能够智能地将其映射到内部 FHIR 侦听器。