我正在寻求配置NGINX以在端口80上接受未加密的HTTP通信,并将其proxy_pass
传输到上游HTTPS服务器。加密应完全通过NGINX进行管理,允许连接到NGINX服务的客户端有效地将HTTP与HTTPS上游服务进行对话。
我正在使用NGINX配置,如下所示,但是,每当向服务器发出简单的HTTP请求时,我都会收到502网关错误。
upstream https-server {
server my-upstream-host-which-speaks-https.example.com:443;
}
server {
listen 80;
listen [::]:80;
location / {
proxy_pass https://https-server;
}
}
这是请求失败期间记录的错误。
2020/07/13 15:41:45 [error] 20#20: *1 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 10.244.1.215, server: , request: "GET / HTTP/1.1", upstream: "https://99.86.230.58:443/", host: "nginx.http-cache.svc.cluster.local"
2020/07/13 15:41:45 [warn] 20#20: *1 upstream server temporarily disabled while SSL handshaking to upstream, client: 10.244.1.215, server: , request: "GET / HTTP/1.1", upstream: "https://99.86.230.58:443/", host: "nginx.http-cache.svc.cluster.local"
此SO post表示此问题很可能是由于NGINX实际上并未将入站HTTP请求转换为HTTPS,因此上游服务器将原始HTTP请求解释为握手的开始。我如何配置NGINX在代理之前执行HTTP到HTTPS的转换,以便它向自己的客户端说HTTP,但向proxy_pass
上游讲HTTPS?
注意:我不希望将HTTP流量重定向到HTTPS,而是proxy_pass而不出现错误。我也肯定会有很多人问:“你为什么要这么做?”我们有一个合法的用例,实际上我们需要MITM后端响应,以便在使用Varnish的缓存配置中正确使用它们。因此,如果将这些类型的评论减少到最低程度,那就太好了:)