我正在尝试在公司代理后面运行 nginx 反向代理。公司代理正在运行
http://someproxy.company.com:3128
适用于 http 和 https 连接。
我的 http 模块中的 nginx 配置如下所示:
upstream subdomain.external.com {
server someproxy.company.com:3128;
}
在服务器模块中如下所示:
server {
listen 443 ssl;
server_name reverse.company.com;
ssl_certificate mycert.cer;
ssl_certificate_key mykey.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
proxy_ssl_server_name on;
ssl_protocols TLSv1.2 TLSv1.3;
location /target {
proxy_pass http://subdomain.external.com/target;
proxy_set_header X-Real-IP $remote_addr;
}
可以看到,反向proxy_pass目标是一个http目标。这在公司代理上按预期工作。
现在我的问题: proxy_pass 目标应该在 https 上!但是如果我将 proxy_pass 目标切换到 https://subdomain.external.com/target,nginx 会尝试连接到 https 上的上游。这会导致错误日志条目:
[error] 6524#6288: *1 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: CLIENT_IP_HERE, server: reverse.company.com, request: "GET /activation HTTP/1.1", upstream: "https://someproxy.company.com:3128/target", host: "reverse.company.com"
正如我在上面提到的,对于 http 和 https 请求,我们的代理地址是 http://someproxy.company.com:3128。
即使 proxy_pass 目标位于 https 上,有没有办法告诉 nginx 使用 http 上的上游?我在位置/目标上尝试了这些参数,但没有成功:
proxy_set_header Host $http_host;
proxy_set_header X_FORWARDED_PROTO http;
proxy_set_header X-Real-IP $remote_addr;
proxy_ssl_verify off;
proxy_set_header X_FORWARDED_PROTO https;
必须设置。