必须在 https server 块中启用 $ssl_protocol 和 $ssl_cipher 变量,仅当 listen 443 ssl; 时有效,配合专用 log_format 和 access_log 指令才能准确记录 tls 版本与加密套件。

要在 Nginx 中准确记录每次 HTTPS 连接实际使用的 SSL/TLS 协议版本和加密套件,必须用对变量、写对位置、配对启用——不是加几行日志就能出数据。
只在 HTTPS server 块中启用 $ssl_protocol 和 $ssl_cipher
这两个变量仅在 listen 443 ssl; 的上下文中有效,HTTP 请求里为空或报错。它们由 Nginx 在 TLS 握手完成后自动填充:
-
$ssl_protocol显示协商结果,如TLSv1.2或TLSv1.3 -
$ssl_cipher显示最终套件,如ECDHE-RSA-AES256-GCM-SHA384(TLSv1.2)或TLS_AES_256_GCM_SHA384(TLSv1.3)
定义专用日志格式并限定作用域
在 http{} 块中定义格式(例如叫 ssl_ext),但不要在这里启用 access_log:
log_format ssl_ext '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$ssl_protocol/$ssl_cipher "$ssl_server_name" $ssl_session_reused';关键点:
- 格式名要唯一,避免与默认
combined冲突 - 只在监听 443 且带
ssl标志的server{}块内启用该日志 - 绝对不要写在
http{}块顶层或listen 80;的 server 里
确保 SSL 模块可用且配置合规
运行 nginx -V 2>&1 | grep --with-http_ssl_module,确认输出包含该模块。若缺失,需重新编译并加入 --with-http_ssl_module 参数。
同时检查 HTTPS server 块是否满足基础要求:
- 必须有
listen 443 ssl;(ssl关键字不可省略) - 已配置
ssl_certificate和ssl_certificate_key - 推荐明确设置
ssl_protocols TLSv1.2 TLSv1.3;和ssl_ciphers,避免协商异常导致变量为空
验证与排错要点
启用后,检查日志文件是否生成、权限是否正确(Nginx worker 需有写入权限),再用 curl 或浏览器发起 HTTPS 请求测试:
- 日志中出现
-/-或空字段,大概率是日志指令放错位置(比如混进了 HTTP server) - 整行缺失或报
invalid number of arguments in "log_format",检查引号是否成对、换行是否误用 - 想同时记录 SNI 域名,可直接加入
$ssl_server_name;需要会话复用状态,加上$ssl_session_reused(值为r或.)











