$ssl_session_reused 是 Nginx 内置变量,取值为 "s"(服务端成功复用)、"."(未复用)、"r"(客户端尝试但服务端拒绝),用于精准标识每请求 SSL/TLS 会话复用状态,支持零开销日志采集、实时聚合分析、性能归因与配置瓶颈定位。

$ssl_session_reused 是 Nginx 提供的一个内置变量,用于标识当前 HTTPS 请求的 SSL/TLS 握手是否复用了已有会话(即是否为“简短握手”)。它不是统计值,而是一个每请求级的字符串标记:"s" 表示服务器端复用(session resumption via session ID 或 ticket),"." 表示未复用(完整握手),"r"(较新版本)表示客户端尝试复用但服务端拒绝(如 ticket 过期或不匹配)。
一、采集:在 access_log 中记录复用状态
直接在 log_format 中加入该变量,即可按请求粒度留存原始信号:
log_format ssl_metrics '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$ssl_protocol $ssl_cipher $ssl_session_reused';启用后,每行日志末尾会出现 s、. 或 r。这是后续所有分析的基础——不依赖采样,无精度损失,且零额外 CPU 开销。
二、实时聚合:用 logtail + Prometheus + Grafana 构建看板
无需修改应用或引入 SDK,只需轻量日志解析:
- 用
logtail(阿里云)、filebeat + metricbeat(Elastic)或vector实时读取 access_log - 对
$ssl_session_reused字段做计数:每秒统计s、.、r出现次数 - 推送到 Prometheus,定义指标如:
nginx_ssl_reused_total{type="s"}、nginx_ssl_reused_total{type="."} - Grafana 中计算复用率:
rate(nginx_ssl_reused_total{type="s"}[5m]) / rate(nginx_ssl_reused_total[5m])
这样可分钟级观测全局复用率趋势,并下钻到具体 upstream、域名或 TLS 版本维度(配合 $server_name、$ssl_protocol 等变量)。
三、归因收益:将复用率转化为可感知的性能节省
复用率本身不是目标,延迟下降和 CPU 节省才是。需建立映射关系:
- RTT 节省:完整握手比复用握手多 1–2 RTT(尤其在高延迟链路)。若平均 RTT 为 80ms,复用率从 70% → 90%,意味着 20% 请求减少约 160ms 首字节延迟(TLS + HTTP/1.1 队头阻塞放大效应下更明显)
- CPU 节省:RSA 2048 完整握手约消耗 0.5–1.5ms CPU 时间(取决于密钥交换方式与硬件加速)。若 QPS=5k,复用率提升 20%,相当于每秒少做 1000 次完整握手,节约 ~1 秒 CPU 时间/秒(单核等效)
- 连接池效率:复用握手更快释放连接,使 keepalive 连接更易复用,间接降低 TIME_WAIT 和新建连接压力
建议在 Grafana 中并列展示:
— SSL 复用率曲线
— p95 TLS handshake time(通过 $upstream_header_time 或 eBPF 抓取)
— Nginx worker CPU usage
三者趋势强相关时,即可确认优化生效。
四、定位瓶颈:用 $ssl_session_reused 辅助调优配置
当复用率偏低(如长期
- 若
r比例高 → 检查ssl_session_timeout是否过短,或ssl_session_tickets off导致无法跨 worker 复用 - 若
.主导且客户端较新(Chrome/Firefox)→ 可能未启用 session ticket(ssl_session_tickets on)或密钥未持久化(ssl_session_ticket_key每次 reload 变更) - 对比不同
$ssl_protocol的$ssl_session_reused分布 → 若 TLSv1.3 复用率显著更高,说明旧协议配置存在缺陷(如 session cache 大小不足)
注意:真实复用率受客户端行为影响(如移动端 WebView 复用策略激进,桌面浏览器更保守),需分终端统计,避免误判服务端问题。











