proxy_ssl_protocols 用于配置 nginx 作为 tls 客户端连接上游 https 后端时允许的协议版本,需与后端实际支持的 tls 版本匹配(如 tlsv1.2 tlsv1.3),避免因协议不兼容导致 502 或握手失败,且依赖 openssl ≥1.1.1 才能启用 tls 1.3。

proxy_ssl_protocols 是 Nginx 代理模块中用于控制 Nginx 与上游 HTTPS 后端服务器建立 SSL/TLS 连接时,所允许使用的协议版本的指令。它不作用于客户端到 Nginx 的连接(那是 ssl_protocols 干的事),而是专管 Nginx 自己作为 TLS 客户端去访问后端服务时的行为。
这个指令直接影响 Nginx 能否成功与后端建立加密连接——如果后端只支持 TLS 1.2,而你配置了 proxy_ssl_protocols TLSv1;,握手就会失败,可能引发 502 或超时错误。
proxy_ssl_protocols 的常见取值与含义
-
TLSv1:仅启用 TLS 1.0(已不推荐,存在安全风险) -
TLSv1.1:启用 TLS 1.1(同样过时,主流已弃用) -
TLSv1.2:启用 TLS 1.2(当前广泛兼容且安全的基线) -
TLSv1.3:启用 TLS 1.3(更高效、更安全,需 Nginx ≥ 1.13.0 + OpenSSL ≥ 1.1.1)
默认值为 TLSv1 TLSv1.1 TLSv1.2(Nginx 1.17.7 之前),但从 1.19.0 开始,默认已改为 TLSv1.2 TLSv1.3(前提是底层 OpenSSL 支持)。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
你可以显式指定组合,例如:
proxy_ssl_protocols TLSv1.2 TLSv1.3;
这表示 Nginx 在连接后端时,只尝试 TLS 1.2 或 TLS 1.3,跳过所有旧版本。
配置时的关键注意事项
-
必须与后端实际支持的协议匹配
若后端(如 Tomcat、Spring Boot、Node.js HTTPS server)仅启用 TLS 1.2,而你写了TLSv1.3但后端不支持,Nginx 会协商失败,日志中可能出现类似:SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number)
不写该指令 ≠ 禁用新协议
缺省时 Nginx 会按默认列表协商,不一定最安全。建议显式声明,避免因版本升级导致意外兼容问题。依赖 OpenSSL 版本能力
即使 Nginx 配置了TLSv1.3,若编译时链接的是 OpenSSL 1.0.2 或更低版本,则实际无效。可通过nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]+'查看实际版本。-
配合 proxy_ssl_ciphers 使用效果更可控
协议版本决定“能不能连”,密码套件决定“连得安不安全”。两者应协同配置,例如:proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
如何验证是否生效
- 在 upstream 块或 location 中启用并配置
proxy_ssl_protocols - 使用
openssl s_client -connect your-backend:443 -tls1_2或-tls1_3手动测试后端是否响应 - 查看 Nginx error log,搜索
SSL_do_handshake或SSL_connect相关错误 - 开启
error_log /path/to/log debug;可捕获详细 TLS 握手过程(注意磁盘空间)
不复杂但容易忽略










