需在 Nginx 的 http 或 server 块中定义含 $ssl_protocol 的自定义日志格式并启用 access_log,确保 SSL 已开启且 Nginx ≥ 1.11.5、OpenSSL ≥ 1.1.1,再通过 awk 等命令分析日志统计 TLS 1.2/1.3 实际使用比例。

要在生产环境中监控 TLS 1.2 与 TLS 1.3 的实际使用比例,核心是让 Nginx 在每次 HTTPS 请求完成握手后,把协商出的协议版本记录到访问日志中。这依赖 $ssl_protocol 这个内置变量,它在 TLS 握手成功后自动生效,值为 TLSv1.2 或 TLSv1.3(不支持时为空)。
启用 $ssl_protocol 日志记录
需在 Nginx 配置中定义一个包含该变量的自定义日志格式,并应用到 server 或 http 块:
- 在
http块内添加日志格式,例如:log_format tls_detail '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $ssl_protocol $ssl_cipher'; - 在对应
server块中启用该格式:access_log /var/log/nginx/access_tls.log tls_detail; - 确保该 server 已启用 SSL(
listen 443 ssl),否则$ssl_protocol恒为空
验证日志是否正常输出
重启 Nginx 后,发起几个 HTTPS 请求(可用 curl -I https://yoursite.com 或浏览器访问),然后检查日志文件:
- 执行
tail -n 5 /var/log/nginx/access_tls.log - 应看到类似这样的行:
203.0.113.42 - - [30/Apr/2026:01:20:15 +0000] "HEAD / HTTP/2" 200 0 "-" "curl/8.7.1" TLSv1.3 TLS_AES_256_GCM_SHA384 - 若第 9 字段(即
$ssl_protocol)为空或出现-,说明请求未走 HTTPS,或 Nginx 版本/SSL 配置不支持该变量(需确认 Nginx ≥ 1.11.5 且 OpenSSL ≥ 1.1.1)
统计 TLS 版本占比(命令行快速分析)
用标准 Linux 工具即可按天/小时提取比例,无需额外部署:
- 统计当日所有 TLS 版本分布:
awk '{print $9}' /var/log/nginx/access_tls.log | sort | uniq -c | sort -nr - 只看最近一小时(假设日志含标准时间戳):
awk -v d="$(date -d '1 hour ago' '+%d\/%b\/%Y:%H')" '$4 ~ d {print $9}' /var/log/nginx/access_tls.log | grep -E 'TLSv1\.(2|3)' | sort | uniq -c - 计算 TLS 1.3 占比(示例):
awk '{if($9=="TLSv1.3") c++} END {print c/NR*100 "%"}' /var/log/nginx/access_tls.log
注意事项与常见问题
该监控方式轻量、可靠,但需注意几点:
-
$ssl_protocol只反映最终协商结果,不是客户端声明支持的所有版本;它真实反映终端实际使用的协议 - 日志中若大量出现
-或空白,可能是 HTTP 请求混入、HTTP/2 over cleartext、或反向代理透传未终止 SSL(如前端有 CDN 且未开启“HTTPS 回源”) - 不要在
location块中配置access_log来覆盖协议记录——$ssl_protocol在 location 级不可用,必须在 server 或 http 级定义日志格式并启用 - 若使用 logrotate,确保新日志文件仍继承相同格式;可配合 cron 每日自动运行统计脚本并存档结果











