Nginx回源多租户云平台时,必须启用proxy_ssl_server_name on并动态设置proxy_ssl_name $host(或$http_x_forwarded_host),确保SNI字段携带用户真实请求域名,否则TLS握手失败。

要让 Nginx 在回源到多租户云平台(如 SaaS 后端、CDN 源站、或共享 IP 的租户网关)时正确建立 HTTPS 连接,关键不是只开 proxy_ssl_server_name on,而是让它把用户真实请求的域名作为 SNI 发送给后端——否则上游无法选出对应租户的证书,TLS 握手直接失败。
必须开启 SNI 并绑定动态域名
Nginx 默认不发送 SNI 字段,即使 proxy_pass 指向 HTTPS 地址,也会用配置里的字面主机名(比如 https://10.0.0.100)或 IP 作为 SNI 值。这对单证书环境无感,但在多租户场景下会错配:
- 在
location块中添加proxy_ssl_server_name on; - 紧跟着设置
proxy_ssl_name $host;——$host是标准化后的 Host 头(小写、去端口),比$http_host更可靠 - 避免写死,例如
proxy_ssl_name "tenant-a.example.com";,除非所有流量都指向同一租户
应对 CDN 或 API 网关改写 Host 头
很多云平台或 CDN(如阿里云全站加速、Cloudflare 回源)会覆盖原始 Host 头,导致 $host 变成源站配置域名(如 origin.prod.cloud),而非用户访问的 shop-123.tenant.com:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 在 CDN 控制台启用“透传原始 Host”功能,通常表现为自动添加
X-Forwarded-Host请求头 - Nginx 中改用
proxy_ssl_name $http_x_forwarded_host; - 同时加一句
proxy_set_header X-Forwarded-Host $host;,方便下游服务识别租户上下文
验证 SNI 是否真正发出
配置写对了,不等于运行时生效。需要确认 TLS 握手阶段实际发出的 SNI 值是否匹配预期:
- 在上游云平台的 Nginx 或网关上开启 debug 日志:
error_log /var/log/nginx/error.log debug;,搜索日志中client sent server name字样 - 用 OpenSSL 手动测试:运行
openssl s_client -connect 10.0.0.100:443 -servername shop-123.tenant.com,观察返回证书的 CN 或 SAN 是否匹配 - 注意:若回源走的是 HTTP 协议,
proxy_ssl_*全部不生效,先确认proxy_pass是https://开头
检查底层支持是否就绪
即使配置无误,也可能因环境限制失败:
- 运行
nginx -V | grep OpenSSL,确保 OpenSSL 版本 ≥ 1.0.2h,且编译时启用了 TLS extensions(enable-tlsext) - 确认上游云平台(如租户网关、K8s Ingress Controller)支持 SNI;老版本 Nginx 或某些负载均衡器可能忽略 SNI 字段,始终返回默认证书
- 如果上游证书未将租户域名列入 SAN 或 CN,即使 SNI 正确,也会触发证书校验失败;生产环境建议开启
proxy_ssl_verify on并配置可信 CA 链

















