写点什么

【问题记录】Nginx 使用域名作为 upstream 时,需要配置 SNI

作者:陈德伟
  • 2023-10-10
    浙江
  • 本文字数:706 字

    阅读完需:约 2 分钟

问题

  • 今天线上环境配置一个 Nginx 请求转发,具体场景是用户请求 https://aaa/xxx,我需要通过 nginx 将其重写成 https://bbb/xxx,也就是用户看到的是请求了 A,但实际我们要转给 B 来处理

  • 这个配置很常见,也很简单,以前经常处理,因此打开 Nginx 的 conf 文件,直接添加如下配置


    location /xxx {       proxy_pass https://bbb/xxx;    }
复制代码


  • 配置后,重启 Nginx,请求了一下 https://aaa/xxx,结果发现返回 502,看 Nginx 的错误日志,发现如下错误:


2023/10/10 11:15:31 [error] 974730#974730: *19901 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, request: "GET /xxx HTTP/1.1", upstream: "https://ip:443/xxx, host: "aaa"
复制代码

原因

  • 上面日志里有两个比较奇怪的地方,一个是我明明配置了域名 https://bbb/xxx;,但 upstream 请求的 host 却是 aaa,这明显不对

  • 经过查询 Nginx 的文档,发现如果 proxy_pass 里使用的域名是虚拟主机域名,就需要设置 SNI,否则 Nginx 就找不到对应的主机

  • 什么是 SNI

  • SNI 是 Server Name Indication 的缩写,它是 TLS 的一个扩展,允许在 TLS 握手开始时告知客户端它要连接的服务器的主机名称。

  • 之所以要用 SNI,是因为存在一个服务器拥有多个域名的情况,也就是一个 IP 对应多个域名,比如很多内网穿透工具提供商给我们生成的域名,都是虚拟主机域名

解决方案

  • 对于虚拟主机,如果要配置到 proxy_pass 里,需要同时配置 SNI 相关信息


    location /xxx {
proxy_ssl_name bbb; proxy_ssl_server_name on; proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_pass https://bbb/xxx; }
复制代码

参考资料

发布于: 刚刚阅读数: 3
用户头像

陈德伟

关注

还未添加个人签名 2018-04-26 加入

兴趣广而不精,从小爱玩游戏还是个手残,假装爱书这么多年还是拙于下笔。从事软件行业十几年也没有什么拿的出手的成就,只能安慰自己贵在坚持。《On Java》译者之一。

评论

发布
暂无评论
【问题记录】Nginx使用域名作为upstream时,需要配置SNI_nginx_陈德伟_InfoQ写作社区