Nginx 反向代理中的 SNI 原理与配置笔记
时间:2025-6-6 11:09 作者:wanzi 分类: NGINX
📘 Nginx 反向代理中的 SNI 原理与配置笔记
🔍 一、什么是 SNI?
SNI(Server Name Indication) 是 TLS 协议的一个扩展。
👉 用来在 TLS 握手阶段,让客户端告诉服务器:“我想访问的是哪个域名。”
🚫 为什么需要它?
- 一个服务器有多个 HTTPS 站点(虚拟主机),共用同一个 IP。
- 如果客户端不说明访问哪个域名,服务器没法知道该返回哪个证书。
- 传统 HTTP 有
Host
头,但 TLS 握手比 HTTP 早,握手时还没有 Host 信息。
🖼 二、工作流程图(简化版)
浏览器 或 Nginx
|
|---> TLS 握手(包含 SNI: api.aa.com)
|
后端服务器(例如 Nginx / Apache)
|
|---> 根据 SNI 选择虚拟主机 & 返回对应证书
|
|---> TLS 成功建立,后续正常通信
🔄 三、在 Nginx 做 HTTPS 反向代理时的问题
默认情况下,Nginx 作为客户端反向代理
https://后端地址
,不会自动发送 SNI 信息。
❌ 结果:
- 后端服务器收不到你要访问的域名;
- 返回默认虚拟主机;
- TLS 握手失败 / 证书错误 / 内容不对。
✅ 四、解决方法:加上 SNI 配置
✔ 最关键的一句配置:
proxy_ssl_server_name on;
这会告诉 Nginx:
"在与后端建立 TLS 连接时,把 proxy_pass 的域名(如 api.aa.com)作为 SNI 发送出去。"
🔧 五、完整配置示例(HTTPS 反向代理)
location /api/ {
proxy_pass https://api.aa.com;
proxy_ssl_server_name on;
proxy_set_header Host api.aa.com; # 可选,确保 Host 头一致
}
📌 六、几点实用说明
项目 | 是否必须 | 说明 |
---|---|---|
proxy_ssl_server_name on; |
✅ 必须 | 开启 SNI,否则后端无法正确选择证书 |
proxy_set_header Host ... |
⚠️ 建议 | 后端有时还会根据 Host 做进一步路由 |
使用 HTTPS upstream | ✅ 必须 | SNI 仅适用于 HTTPS 协议 |
后端必须支持 SNI 虚拟主机 | ✅ | 如 Nginx/Apache 的 server_name 配置 |
✅ 七、总结一句话
当 Nginx 用
proxy_pass
去请求一个 启用了多个 HTTPS 虚拟主机的后端时,一定要加上proxy_ssl_server_name on;
,不然后端服务器不知道你要哪个站点,会返回错误证书或内容。