核心是启用$ssl_protocol、$ssl_cipher、$ssl_server_name等变量,定义专用日志格式ssl_ext并在listen 443 ssl的server块中启用access_log,同时确保Nginx已编译--with-http_ssl_module模块且路径权限正确。

要在 Nginx 中记录 HTTPS 连接使用的协议参数(如 TLS 版本、加密套件、SNI 域名等),核心是利用 Nginx 内置的 $ssl_* 变量,配合自定义日志格式和正确的 HTTPS server 配置。这不是开启一个开关就能实现的功能,而是需要明确启用 SSL 上下文并精准绑定日志作用域。
确认 Nginx 已启用 SSL 模块
这是前提,否则所有 $ssl_* 变量都不可用:
- 运行
nginx -V 2>&1 | grep --with-http_ssl_module,输出中必须包含该模块 - 若缺失,需重新编译 Nginx 并加入
--with-http_ssl_module参数 - 确保配置中使用的是
listen 443 ssl;(注意ssl关键字不能省略)
定义含 SSL 参数的日志格式
在 http{} 块中添加自定义格式,只对 HTTPS 请求生效:
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';
-
$ssl_protocol:实际协商的 TLS 版本,例如TLSv1.3 -
$ssl_cipher:最终选用的加密套件,例如ECDHE-ECDSA-AES128-GCM-SHA256 -
$ssl_server_name:客户端通过 SNI 发送的域名(默认已启用,无需额外配置ssl_sni on) -
$ssl_session_reused:显示r(复用)或.(未复用),用于分析会话复用效率
在 HTTPS server 块中启用该日志
仅在 listen 443 ssl; 的 server{} 块内配置,避免与 HTTP server 混用:
access_log /var/log/nginx/ssl_access.log ssl_ext;- 确保日志路径目录存在,且 Nginx worker 进程有写权限(如
chown nginx:nginx /var/log/nginx) - HTTP 请求不会触发这些变量,因此不要把同一份
access_log指令同时用于 HTTP 和 HTTPS server 块
验证与常见问题
配置完成后需验证是否真正生效:
- 执行
nginx -t检查语法,再nginx -s reload重载配置 - 发起 HTTPS 请求后,检查日志文件是否出现类似
192.168.1.100 - - [14/Jun/2026:08:28:00 +0000] "GET / HTTP/1.1" 200 1234 "..." "curl/8.10.1" TLSv1.3/ECDHE-ECDSA-AES128-GCM-SHA256 "example.com" .的条目 - 如果 SSL 变量全为空或显示短横线
-,大概率是 server 块缺少ssl关键字,或日志指令误放在了 HTTP server 中











