nginx实现https平滑分发需区分四层sni透传(不解密、低延迟、多证书共存)和七层tls终止(统管证书、深度路由、灰度可控),均依赖热重载、前置校验、版本化与原子切换保障零中断。

Nginx 对 HTTPS 流量的平滑分发,关键在于不中断连接、不触发客户端重握手、不因配置变更导致 TLS 握手失败。它不是简单地“转发 HTTPS”,而是根据业务需求,在四层(SNI 透传) 或 七层(TLS 终止后路由) 上做精准分流,并确保每次变更都可验证、可回退。
四层 SNI 透传分流:不解密、低延迟、多证书共存
适用于后端各自持有证书、Nginx 不参与加解密的场景,比如统一入口网关对接多个独立 HTTPS 服务。
- 确保 Nginx ≥ 1.19.4,OpenSSL ≥ 1.1.1,并已编译启用
stream_ssl_preread_module - 所有配置写在顶层
stream { }块中,不能放在http内 - 使用
map指令按SNI 域名匹配上游:
map $ssl_preread_server_name $upstream_backend {
hostnames;
app1.example.com app1_srv;
app2.example.com app2_srv;
default app1_srv;
}
upstream app1_srv { server 10.0.1.10:443; }
upstream app2_srv { server 10.0.1.20:443; }
server {
listen 443 ssl preread;
ssl_preread on;
proxy_pass $upstream_backend;
}
- 后端必须自行处理 TLS;Nginx 只做 TCP 层转发,零证书依赖,天然支持新旧证书并存
- 切换时只需改
map规则 +nginx -s reload,毫秒级生效,无连接中断
七层 TLS 终止分流:统一证书、深度路由、可控性强
适用于需统管证书、做路径/请求头/设备类型识别、灰度发布或 WAF 防护的场景。
- 每个
server块监听443 ssl,绑定明确server_name - 支持同一域名下双证书并存(Nginx ≥ 1.19.0):
server {
listen 443 ssl;
server_name api.example.com;
# 旧证书(fallback)
ssl_certificate /etc/nginx/ssl/api-old.crt;
ssl_certificate_key /etc/nginx/ssl/api-old.key;
# 新证书(主用)
ssl_certificate /etc/nginx/ssl/api-new.crt;
ssl_certificate_key /etc/nginx/ssl/api-new.key;
ssl_protocols TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem;
location / {
proxy_pass https://backend_api;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
}
}
- 新旧证书同时加载,客户端自动协商(基于 SNI 和 ALPN),无需修改 DNS 或客户端行为
- 配合
map或split_clients模块,可按 IP、Header、Cookie 实现灰度:
map $http_user_agent $is_mobile {
~*android|ios "" "";
default 0;
}
upstream backend_web { server 192.168.1.10:80; }
upstream backend_mobile { server 192.168.1.20:80; }
server {
location / {
proxy_pass http://backend_$is_mobile;
}
}
平滑发布的三个硬性保障
-
热重载代替重启:始终用
nginx -s reload,避免systemctl restart nginx强杀进程 -
前置校验不可跳过:每次变更前执行
nginx -t,检查语法、证书路径、文件权限(如600)、私钥格式 -
版本化与原子切换:
- Nginx 配置和证书全部纳入 Git,每次发布打 tag(如
v20260705-api-tls-upgrade) - 证书用软链接管理:
/etc/nginx/ssl/current/cert.pem → /etc/nginx/ssl/v20260705/cert.pem,切换仅改链接 - 回滚只需切回上一 commit + 恢复软链 + reload,全程秒级完成
- Nginx 配置和证书全部纳入 Git,每次发布打 tag(如
不复杂但容易忽略。











