直接用 Nginx 内置变量 $ssl_protocol 即可准确记录客户端协商的 TLS 版本(如 TLSv1.3),需确保已编译 --with-http_ssl_module 模块、server 块配置 listen 443 ssl;,并在 http 块定义含 $ssl_protocol 的日志格式,仅用于 HTTPS server 块启用 access_log。

直接用 Nginx 内置变量 $ssl_protocol 即可记录客户端实际协商的 TLS 版本(如 TLSv1.3 或 TLSv1.2),它由 SSL 握手过程实时确定,准确且无需额外模块。
确认前提条件
确保 Nginx 已启用 SSL 模块并正确配置 HTTPS:
- 运行
nginx -V 2>&1 | grep --with-http_ssl_module,输出中必须包含该模块 - 对应
server块必须含listen 443 ssl;(ssl关键字不可省略) - 若使用自定义编译版本,需确认 OpenSSL ≥ 1.1.1(才支持 TLSv1.3)
定义含 TLS 版本的日志格式
在 http{} 块中添加自定义格式,将 $ssl_protocol 作为独立字段:
log_format tls_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'tls="$ssl_protocol" cipher="$ssl_cipher" sni="$ssl_server_name"';注意:$ssl_protocol 在非 HTTPS 请求中为空或显示 -,因此该格式应仅用于 HTTPS server 块。
在 HTTPS server 中启用日志
仅在启用 SSL 的 server 块内配置,避免混用 HTTP/HTTPS:
- 指定日志路径需有写权限(如
/var/log/nginx/tls_access.log) - 执行
nginx -t验证语法,再nginx -s reload生效 - 成功后日志样例:
203.0.113.5 - - [29/Jul/2026:12:15:33 +0000] "GET / HTTP/1.1" 200 1528 "" "curl/8.10.1" tls="TLSv1.3" cipher="TLS_AES_256_GCM_SHA384" sni="example.com"
常见问题排查
若日志中 tls= 后为空或为短横线 -:
- 检查
server块是否遗漏ssl关键字(必须是listen 443 ssl;) - 确认未把
access_log指令误放在 HTTPserver块中 - 验证证书已正确加载且无
ssl_certificate和ssl_certificate_key路径错误


















