Nginx中准确审计TLS会话复用率应使用$ssl_session_reused(客户端直连)或$upstream_ssl_session_reused(代理后端),而非不可靠的$ssl_session_id;二者值为r表示复用、.表示新建,需按场景正确配置日志格式并统计分析。

直接在 Nginx 日志中记录 $ssl_session_id 并不可靠——它只表示客户端在 ClientHello 中携带的 Session ID 字段值,**不反映实际是否复用成功**。真正能准确审计复用率的变量是 $upstream_ssl_session_reused(用于代理后端 HTTPS)或 $ssl_session_reused(用于客户端直连 Nginx 的 HTTPS 服务)。下面分场景说明如何正确采集、分析和优化。
区分两个关键变量:用途与位置不同
$upstream_ssl_session_reused:仅在 proxy_pass https://... 场景下有效,表示 Nginx 与 upstream 后端之间 TLS 握手是否复用。值为 r 表示复用,.(点)表示未复用。
$ssl_session_reused:用于 Nginx 自身作为 HTTPS 服务端时,表示客户端与 Nginx 之间的 TLS 握手是否复用。同样,r = 复用,. = 新建会话。
二者不能混用。若你在日志里看到 $ssl_session_id 非空,但 $upstream_ssl_session_reused 是 .,说明客户端发了 Session ID,但 Nginx 和后端之间并未复用——问题出在 upstream 配置或后端响应上。
配置日志格式并采集复用状态
在 http 块中定义带复用标识的日志格式:
log_format ssl_reuse '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
"$http_user_agent" "$http_x_forwarded_for" '
'upstream_ssl_reused=$upstream_ssl_session_reused '
'ssl_reused=$ssl_session_reused '
'ssl_session_id="$ssl_session_id"';
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
再在 server 或 location 块中启用该格式:
- 若代理 HTTPS 后端,在
location中加:access_log /var/log/nginx/proxy_reuse.log ssl_reuse; - 若自身是 HTTPS 站点,在
server块中加:access_log /var/log/nginx/https_reuse.log ssl_reuse;
统计复用率并定位瓶颈
采集 1 小时日志后,用命令快速计算复用率:
# 统计 upstream 复用率(代理场景)
awk '$11 ~ /r/ {r++} $11 ~ /\./ {d++} END {printf "upstream reuse rate: %.2f%\n", r/(r+d)*100}' /var/log/nginx/proxy_reuse.log
# 统计客户端直连复用率(Nginx 自身 HTTPS 服务)
awk '$12 ~ /r/ {r++} $12 ~ /\./ {d++} END {printf "client reuse rate: %.2f%\n", r/(r+d)*100}' /var/log/nginx/https_reuse.log
健康阈值参考:
- 客户端直连复用率 > 70%:合理(受客户端行为、超时设置影响)
- upstream 复用率 • upstream 未配
keepalive或连接池过小
• 缺少proxy_ssl_session_reuse on或 SNI 不一致
• 后端主动返回Connection: close或空闲超时短于 Nginx keepalive_timeout
配合抓包验证复用行为
日志只能告诉你“是否复用”,但无法说明“为什么没复用”。建议在复用率低的时段做轻量抓包:
- 在 Nginx 机器执行:
tcpdump -i any -nn -s 0 port <em>upstream_port</em> and tls -w upstream_tls.pcap - 用 Wireshark 打开,过滤
tls.handshake.type == 1(ClientHello) - 观察每个 ClientHello 是否含
Session ID字段(非空)或pre_shared_key扩展(TLS 1.3) - 若含且后续握手只有 ChangeCipherSpec + Finished(无 Certificate/ServerKeyExchange),即为成功复用
若 ClientHello 中 Session ID 为空,说明客户端根本没尝试复用——此时应检查客户端 SDK 或浏览器策略;若 ID 非空但握手仍完整,则问题在 upstream 侧证书、SNI 或协议兼容性。

















