我目前使用 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