«

Nginx 反向代理中的 SNI 原理与配置笔记

时间:2025-6-6 11:09     作者:wanzi     分类: NGINX


📘 Nginx 反向代理中的 SNI 原理与配置笔记


🔍 一、什么是 SNI?

SNI(Server Name Indication) 是 TLS 协议的一个扩展。

👉 用来在 TLS 握手阶段,让客户端告诉服务器:“我想访问的是哪个域名。”

🚫 为什么需要它?


🖼 二、工作流程图(简化版)

浏览器 或 Nginx
    |
    |---> TLS 握手(包含 SNI: api.aa.com)
    |
后端服务器(例如 Nginx / Apache)
    |
    |---> 根据 SNI 选择虚拟主机 & 返回对应证书
    |
    |---> TLS 成功建立,后续正常通信

🔄 三、在 Nginx 做 HTTPS 反向代理时的问题

默认情况下,Nginx 作为客户端反向代理 https://后端地址不会自动发送 SNI 信息

❌ 结果:


✅ 四、解决方法:加上 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;,不然后端服务器不知道你要哪个站点,会返回错误证书或内容。