直接在Nginx日志中记录$ssl_protocol可准确统计TLSv1.2/TLSv1.3实际使用比例,需在http块定义含该变量的日志格式、server块启用HTTPS监听且满足版本要求,再用awk等命令分析日志。

直接在 Nginx 日志中记录并统计 $ssl_protocol,就能准确掌握 TLSv1.2、TLSv1.3 等协议的实际使用比例——它反映的是真实握手结果,不是客户端声明能力。
配置日志格式记录协议版本
必须在 http 块中定义含该变量的日志格式,并确保对应 server 块启用了 HTTPS 监听:
- 添加日志格式,例如:
log_format tls_stat '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $ssl_protocol'; - 在 server 块中启用:
access_log /var/log/nginx/ssl_ratio.log tls_stat; - 确认该 server 使用了
listen 443 ssl;,否则$ssl_protocol恒为空 - Nginx 版本需 ≥ 1.11.5,OpenSSL ≥ 1.1.1,且编译时启用了
--with-http_ssl_module
验证日志是否正常输出
重载配置后,用 curl -I https://yoursite.com 发起请求,再检查日志末尾字段:
- 正常应看到类似
TLSv1.3或TLSv1.2的值(第9或第12字段,取决于你的字段数) - 若该位置为空或为
-,说明请求未走 HTTPS,或 SSL 终止不在当前 Nginx 实例上(如前端有 CDN 或代理) - 可执行
tail -n 3 /var/log/nginx/ssl_ratio.log快速确认
用命令行快速统计占比
无需额外工具,Linux 标准命令即可按需提取:
- 查看全部协议分布:
awk '{print $9}' /var/log/nginx/ssl_ratio.log | sort | uniq -c | sort -nr - 计算 TLS 1.3 占比:
awk '$9=="TLSv1.3" {c++} END {print c/NR*100 "%"}' /var/log/nginx/ssl_ratio.log - 统计最近一小时的 TLSv1.2 使用量:
awk -v h="$(date -d '1 hour ago' '+%d/%b/%Y:%H')" '$4 ~ h && $9=="TLSv1.2" {c++} END {print c+0}' /var/log/nginx/ssl_ratio.log
注意协议字段的真实含义
$ssl_protocol 是协商结果,不是客户端支持列表:
- 它排除了降级攻击干扰,也排除了仅声明不使用的“纸面支持”
- 若某客户端同时支持 TLSv1.2 和 TLSv1.3,但日志里全是 TLSv1.2,说明服务端或中间设备未开启 TLSv1.3
- 若大量 TLSv1.2 出现在特定 UA(如 Android 4.4 WebView),说明是终端能力限制,不是配置问题


















