【问题记录】Nginx 使用域名作为 upstream 时,需要配置 SNI
问题
今天线上环境配置一个 Nginx 请求转发,具体场景是用户请求 https://aaa/xxx,我需要通过 nginx 将其重写成 https://bbb/xxx,也就是用户看到的是请求了 A,但实际我们要转给 B 来处理
这个配置很常见,也很简单,以前经常处理,因此打开 Nginx 的 conf 文件,直接添加如下配置
复制代码
配置后,重启 Nginx,请求了一下 https://aaa/xxx,结果发现返回 502,看 Nginx 的错误日志,发现如下错误:
复制代码
原因
上面日志里有两个比较奇怪的地方,一个是我明明配置了域名 https://bbb/xxx;,但 upstream 请求的 host 却是 aaa,这明显不对
经过查询 Nginx 的文档,发现如果 proxy_pass 里使用的域名是虚拟主机域名,就需要设置 SNI,否则 Nginx 就找不到对应的主机
什么是 SNI
SNI 是 Server Name Indication 的缩写,它是 TLS 的一个扩展,允许在 TLS 握手开始时告知客户端它要连接的服务器的主机名称。
之所以要用 SNI,是因为存在一个服务器拥有多个域名的情况,也就是一个 IP 对应多个域名,比如很多内网穿透工具提供商给我们生成的域名,都是虚拟主机域名
解决方案
对于虚拟主机,如果要配置到 proxy_pass 里,需要同时配置 SNI 相关信息
复制代码
参考资料
版权声明: 本文为 InfoQ 作者【陈德伟】的原创文章。
原文链接:【http://xie.infoq.cn/article/904cde618de0b109680078734】。文章转载请联系作者。
评论