Nginx 反代 SSL_do_handshake 问题解决思路
内容提要
本文讨论了Nginx反向代理中的502 Bad Gateway错误,主要原因是SSL握手失败,通常是由于未启用SNI导致SSL证书无法正确识别。解决方法是在Nginx配置中添加`proxy_ssl_name`和`proxy_ssl_server_name`参数,以确保SSL连接的正确性。
延伸解读
SNI 缺失为何导致 502
文章指出,当上游服务器在同一 IP 上托管多个 HTTPS 站点时,Nginx 反代默认不发送 SNI,上游无法确定该返回哪张证书,握手因此失败并返回 502。错误日志中的 wrong version number 正是这一问题的典型表现。理解这一点有助于快速区分是证书本身问题还是 SNI 未启用。
配置修复的关键参数
解决方法是在 location 块中加入 proxy_ssl_name 和 proxy_ssl_server_name on。前者指定要反代的目标域名,后者启用 SNI 扩展。文章强调需将示例中的 7bu.top 替换为实际反代的域名,否则 SNI 信息仍不正确,握手可能继续失败。
CDN 场景的类似风险
文章提到,类似问题偶尔也会出现在使用 CDN 时,多因 CDN 配置未设置 SNI 导致。此时可通过设置回源 HOST 来解决,并以 99CDN 面板为例说明。这提示读者在排查 502 时,不应只关注 Nginx 本身,CDN 回源配置也可能引入相同症状。
Q&A
Nginx 反代时出现 502 Bad Gateway 错误的主要原因是什么?
主要原因是 SSL 握手失败,通常是由于未启用 SNI 导致 SSL 证书无法正确识别。
如何解决 Nginx 反代中的 SSL 握手失败问题?
在 Nginx 配置中添加 `proxy_ssl_name` 和 `proxy_ssl_server_name` 参数。
什么是 SNI,它在 SSL 握手中有什么作用?
SNI 是 TLS 协议的扩展,确保客户端能够访问正确的 SSL 证书,特别是在多个域名共享同一 IP 地址时。
在 Nginx 配置中如何正确设置反代的域名?
在配置文件的 location 块中,将 `proxy_ssl_name` 设置为实际反代的域名,并启用 `proxy_ssl_server_name`。
使用 CDN 时可能出现哪些与 SSL 握手相关的问题?
通常是由于配置 CDN 时未设置 SNI 导致的 SSL 握手失败。
Nginx 反代的配置示例是什么样的?
配置示例包括设置 `proxy_pass`、`proxy_set_header` 和 SSL 相关参数,如 `proxy_ssl_name` 和 `proxy_ssl_server_name`。