直接用 $ssl_protocol 记录 Nginx 日志可实时准确统计客户端真实 TLS 版本分布,需在 http 块定义含该变量的日志格式并应用于 listen 443 ssl 的 server 块,配合 awk 等命令分析版本占比、定位老旧客户端及设置告警。

直接用 $ssl_protocol 记录并分析 Nginx 访问日志,就能实时看到每个客户端实际协商使用的 TLS 版本——它不看配置写了什么,只反映真实连接结果,是监控分布最准、最轻量的方式。
一、让日志稳定输出 TLS 版本
在 http{} 块中定义一条含该变量的日志格式,例如:
log_format tls_dist '$remote_addr [$time_local] "$request" $status $ssl_protocol "$http_user_agent"';
再把这条格式应用到启用 HTTPS 的 server{} 块里:
server {
listen 443 ssl;
server_name example.com;
# 其他 SSL 配置(证书、密钥等)
access_log /var/log/nginx/tls-distribution.log tls_dist;
}注意三点:
- 必须写
listen 443 ssl,漏掉ssl关键字,$ssl_protocol恒为空 - Nginx 必须自己终止 SSL(即加载证书完成握手),不能透传 HTTPS 到后端
- 客户端需访问
https://地址,HTTP 请求对应字段为空或-
二、快速统计各版本真实占比
日志跑几小时后,用标准 Linux 命令就能出分布:
- 查全部版本频次(降序):
awk '{print $6}' /var/log/nginx/tls-distribution.log | sort | uniq -c | sort -nr - 查最近一小时 TLSv1.2 和 TLSv1.3 使用情况:
awk -v d="$(date -d '1 hour ago' '+%d\/%b\/%Y:%H')" '$4 ~ d {print $6}' /var/log/nginx/tls-distribution.log | grep -E 'TLSv1\.(2|3)' | sort | uniq -c - 抓仍在用 TLSv1.0/1.1 的请求(合规排查重点):
grep -E 'TLSv1\.0|TLSv1\.1' /var/log/nginx/tls-distribution.log | head -10
三、结合 UA 和 IP 定位问题来源
光看版本不够,得知道是谁在用、为什么用:
- 查 TLSv1.0 的高频 User-Agent:
grep 'TLSv1\.0' /var/log/nginx/tls-distribution.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -nr | head -5 - 查对应 IP 的请求频率和集中时段:
grep 'TLSv1\.0' /var/log/nginx/tls-distribution.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5 - 若发现大量 TLSv1.0 但服务端已禁用,可能是 WinXP IE6/7、老旧 IoT 设备,或中间设备强制降级(如某些企业网关)
四、日常监控建议
把统计逻辑脚本化,能真正落地:
- 当 TLSv1.0 占比超过 0.1%,自动发邮件告警
- 当 TLSv1.3 连续 3 天低于 30%,提示客户端兼容性可能受限
- 配合
$ssl_cipher一起记录,可验证是否真用上了强套件(比如出现TLSv1.3 TLS_AES_256_GCM_SHA384才算达标)


















