同一台服务器上,经常需要让 443 端口同时服务多个域名,甚至不同类型的服务。借助 Nginx 的 stream 模块与 ssl_preread 能力,可以在不终止 TLS 的情况下按 SNI 将流量分发给不同后端。
在 stream 层读取 ClientHello 中的 SNI,然后用 map 将不同的 SNI 映射到不同的本地端口:
stream {
map $ssl_preread_server_name $backend {
example.com 127.0.0.1:8443;
default 127.0.0.1:8444;
}
server {
listen 443;
ssl_preread on;
proxy_pass $backend;
}
}
后端的 TLS 证书与 SNI 需要保持一致;map 的匹配顺序从上到下,default 兜底未匹配的域名。配合反向代理与证书管理工具,可以构建出简洁稳定的多服务架构。