You need to enable JavaScript to run this app. nginx+FastAPI+Docker架构下HTTPS访问API触发SSL握手失败排查
优惠活动
大模型
产品
解决方案
定价
更多

nginx+FastAPI+Docker架构下HTTPS访问API触发SSL握手失败排查

核心问题根因
  • 报错本质是Nginx和后端FastAPI的通信协议完全不匹配
  • 你当前运行的FastAPI容器只提供明文HTTP服务,没有部署任何TLS加密能力。但HTTPS站点的配置里,你让Nginx通过HTTPS协议去连接后端的8080端口:Nginx把TLS握手报文发给FastAPI,而FastAPI只识别明文HTTP请求,自然会输出Invalid HTTP request received的警告;反过来Nginx收不到合法的TLS响应,就会抛出peer closed connection in SSL handshake while SSL handshaking to upstream的错误。
  • 你之前尝试移除80端口的server块没有解决问题,是因为这个故障和80端口的配置完全无关——问题从一开始就出在443端口的server块的反代规则写错了。
一步到位修复操作
  • 打开443端口server块下/api/路径的location配置,把proxy_pass的协议从https改回http:
    原错误配置:proxy_pass https://docker_fastapi;
    修正为:proxy_pass http://docker_fastapi;
  • 删掉该location块里多余的SSL反代配置proxy_ssl_server_name on;,这个参数是给连接HTTPS上游服务准备的,现在后端是纯HTTP,留着没有任何作用,还可能引起异常。
  • 不需要给内网的FastAPI服务单独部署SSL证书,标准的Nginx反代架构就是只在边缘层(也就是Nginx)做HTTPS加密:用户到Nginx的公网流量走加密通道,Nginx到Docker内网的后端服务走明文HTTP,是经过验证的通用做法,不需要在内网链路叠两层SSL,平白增加性能损耗。
验证与配套优化
  • 改完配置先执行nginx -t做语法校验,确认没有配置错误后再重载Nginx生效
  • 不要完全删掉80端口的监听块,你可以把80端口块的内容替换成全站HTTPS跳转规则,实现HTTP请求自动跳转到HTTPS版本
  • 可以直接在Nginx容器内执行curl http://docker_fastapi:8080/api/,快速验证到后端的明文连通性是否正常

内容的提问来源于stack exchange,提问作者Vinh Ta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 13:36:02