Nginx 上游块破坏 SSL 握手

问题描述 投票:0回答:0

我目前使用 nginx 作为 HTTP->HTTPS 代理。我正在尝试修改我的 nginx 配置以使用上游块来启用 keepalive 连接。但是,出于某种原因,使用上游而不是直接将地址写入 proxy_pass 会导致 SSL 失败。具体来说,我看到的错误是:

upstream timed out (60: Operation timed out) while SSL handshaking upstream, client: 127.0.0.1, server: localhost, request "GET <path> HTTP/1.1", upstream: "https://<url>", host: "localhost:<port>"

我之前在服务器关闭连接时看到了一个不同的错误,添加

proxy_ssl_server_name on;
已修复(被错误地排除在新的
location
块之外)

为什么使用

upstream
会导致 SSL 超时失败,而使用
location
而不是
proxy_pass https://<url>
的其他相同
proxy_pass https://<upstream-block-name>
块有效?

作为参考,我的配置的精简版:

http {
    upstream testupstream {
        server <server_name>;
        keepalive 64;
    }

    server {
        listen 127.0.0.1:<port>;
        server_name localhost;

        location ~ ^\/upstream\/test\/(?<param>.+){
            resolver <resolver ip>;
            resolver_timeout 2s;
            proxy_pass https://testupstream/$param;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_redirect off;
            proxy_pass_request_headers on;
            proxy_ssl_server_name on;
       }
  
       location ~ ^\/original\/working\/location\/(?<param>.+){
           resolve <resolver ip>;
           resolver_timeout 2s;
           proxy_pass https://<server_name>/$param;
           proxy_redirect off;
           proxy_pass_request_headers on;
           proxy_set_header Connection "";
           proxy_ssl_server_name on;
           proxy_http_version 1.1;
        }
}

映射到第二个位置 (/original/working/location/some_param) 的请求成功地使用 HTTPS 调用上游服务器,而对第一个位置 (/upstream/test/some_param) 的请求因这些 SSL 握手问题而失败。这两个块有什么区别?

奇怪的是,刚开始测试的时候,有几个请求成功了。我尝试使用 stub_status 位置来检查一些东西,之后由于这个问题我开始看到挂起的请求。删除 stub_status 配置并重新启动 nginx 没有解决问题。

我检查了日志,确定DNS解析正常,可以直接调用上游服务器

curl

nginx ssl proxy keep-alive nginx-upstreams
© www.soinside.com 2019 - 2024. All rights reserved.