本质是Nginx与HTTPS后端SSL握手失败导致连接被重置,主因包括:后端不可达、SNI未启用、SSL会话复用不兼容、TLS协议/加密套件不匹配;需逐项排查服务状态、启用proxy_ssl_server_name on、禁用proxy_ssl_session_reuse off、限定proxy_ssl_protocols。

这个报错本质是 Nginx 在跟 HTTPS 后端建立 SSL 连接时,对方提前关闭了连接。原因不是单一的,得结合场景逐项排查,重点在 SSL 协商、域名识别、服务状态和配置兼容性这几个环节。
检查后端服务是否真实可达且正常运行
这是最基础也最容易被跳过的一步。报错里出现 Connection reset by peer 或 Connection refused,很可能是后端根本没起来,或者监听地址写错了。
- 用 curl -Iv https://后端域名或IP:端口 直连测试,确认能完成 TLS 握手并返回 HTTP 响应
- 特别注意:如果后端在容器或内网,避免把 127.0.0.1 写进
proxy_pass—— Nginx 进程看到的是它自己的 localhost,不是容器或宿主机的 - 检查后端服务日志,确认没有启动失败、证书加载异常或监听端口被占用等情况
启用 SNI 支持:必须加 proxy_ssl_server_name on
当后端是共享 IP 的多租户环境(比如云上一个公网 IP 挂多个 HTTPS 域名),Nginx 默认只发 IP 地址,不带 Host 名,后端无法判断该路由到哪个证书或站点,就会直接断连。
- 在对应
location块中加入:proxy_ssl_server_name on; - 同时确保
proxy_pass使用的是域名(如https://api.example.com),而不是纯 IP - 这个配置从 Nginx 1.7.0 起支持,老版本(如 1.4.x)需先升级
禁用 SSL 会话复用:设 proxy_ssl_session_reuse off
某些后端(尤其是自建或老旧服务)对 TLS session resumption 支持不完整,Nginx 复用前一次握手参数会导致协议/密钥套件不匹配,第二次请求就握手失败。
- 在
location或upstream块中添加:proxy_ssl_session_reuse off; - 尤其适用于“第一次请求成功、后续全失败”或“短时间高频请求报错”的情况
- 副作用是每次连接都重走完整 TLS 握手,性能略降,但稳定性优先
核对 SSL 协议与加密套件兼容性
后端若只支持 TLS 1.2+ 或特定国密/旧算法,而 Nginx 默认协商范围太宽或太窄,也会导致握手中断。
- 显式声明协议版本:proxy_ssl_protocols TLSv1.2 TLSv1.3;(避免包含 TLSv1.0/TLSv1.1,除非后端明确要求)
- 如需兼容旧系统,可放宽:proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
- 一般无需配
proxy_ssl_ciphers,除非后端有强限制;误配反而容易引发不兼容


















