Nginx 中判断 SSL 会话复用状态的正确变量是 $ssl_session_reused(客户端到 Nginx)和 $upstream_ssl_session_reused(Nginx 到后端),值为 r 表示复用成功、. 表示新建;二者不可混用,$ssl_session_id 仅是客户端发送的 ID 字符串,不能反映实际复用状态。

Nginx 并没有 $ssl_reuse 这个变量。真正用于记录 SSL 会话复用状态的是 $ssl_session_reused(客户端到 Nginx)和 $upstream_ssl_session_reused(Nginx 到后端 HTTPS 服务)。混淆变量名会导致日志为空、统计失真,甚至误判优化效果。
要真实验证 SSL 会话复用是否生效,必须用对变量、配对日志、结合行为观测,不能只看配置写了没。
注意:$ssl_session_id 不可用于判断是否复用成功——它只是客户端发来的 Session ID 字符串,不反映服务端是否实际复用了该会话。
正确采集复用状态的变量与含义
$ssl_session_reused
适用于 Nginx 自身作为 HTTPS 服务端(即用户直连 Nginx 的 443 端口)
值为r表示复用成功,.(英文句点)表示新建会话$upstream_ssl_session_reused
仅在proxy_pass https://...场景下有效,表示 Nginx 与后端 HTTPS 服务之间是否复用 TLS 会话
同样:r= 复用,.= 新建二者互不替代,也不能混用。例如:你看到
$ssl_session_id非空,但$upstream_ssl_session_reused是.,说明客户端想复用,但 Nginx 和后端之间没复用成功——问题在 upstream 配置或后端响应。
配置日志格式并启用统计
在 http 块中定义带复用标识的日志格式:
log_format ssl_debug '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'ssl_reused=$ssl_session_reused '
'upstream_ssl_reused=$upstream_ssl_session_reused '
'ssl_session_id="$ssl_session_id"';然后在对应 server 或 location 块中启用:
access_log /var/log/nginx/ssl_access.log ssl_debug;
重启 Nginx 后,访问日志会出现类似行:
192.168.1.100 - - [10/May/2026:06:15:22 +0000] "GET /api/v1/user HTTP/2.0" 200 124 "-" "curl/8.10.1" "-" ssl_reused=r upstream_ssl_reused=r ssl_session_id="a1b2c3..."
从日志中快速统计复用率
用 awk 统计最近 1 万条请求的复用比例(以 $ssl_session_reused 为例):
tail -n 10000 /var/log/nginx/ssl_access.log | \
awk '{for(i=1;i<=NF;i++) if($i ~ /^ssl_reused=/) {split($i,a,"="); cnt++; if(a[2]=="r") hit++}} END {printf "复用率: %.1f%% (%d/%d)\n", hit/cnt*100, hit, cnt}'- 复用率长期低于 60%,需检查
ssl_session_cache容量或ssl_session_timeout是否过短 - 若
upstream_ssl_reused大量为.,但ssl_reused是r,说明客户端到 Nginx 复用正常,问题出在代理链路上
交叉验证:不止看日志,还要看连接行为
-
抓包确认(Wireshark 或 tcpdump):过滤后端目标端口,观察 TLS 握手流程
- 完整握手:Client Hello → Server Hello → Certificate → Server Key Exchange → …(4–5 轮 RTT)
- 复用成功:Client Hello(含 Session ID 或 ticket)→ Server Hello(含相同 Session ID)→ Change Cipher Spec → Finished(1–2 RTT)
-
查看活跃连接数稳定性:
ss -tnp | grep :443 | grep nginx | wc -l
若启用了
keepalive 32且复用率高,该数值应稳定在32 × worker_processes附近,而非频繁波动 -
开启 debug 日志临时排查:
error_log /var/log/nginx/debug.log debug;
搜索关键词
SSL reused session或SSL new session,直接定位复用决策点
不复杂但容易忽略:变量名写错、作用域配错(比如把 upstream_ssl_session_reused 写在非 proxy 场景)、或只盯着 $ssl_session_id 看——这些都会让你以为“开了就有效”,其实复用率可能接近于零。


















