Nginx HTTPS日志需自定义格式并限定作用域:在http块中用$remote_addr、$ssl_protocol/$ssl_cipher、"$ssl_server_name"等变量定义log_format,仅在listen 443 ssl的server块启用access_log,确保SSL模块启用、语法正确且权限到位。

要让 Nginx 在 HTTPS 流量中既记录标准访问信息(如 IP、URL、状态码),又体现 TLS 层关键参数(如协议版本、加密套件、SNI 域名),不能只靠默认日志格式,必须组合使用内置 SSL 变量并限定作用域。
定义含 TLS 参数的专用日志格式
在 http{} 块中添加自定义格式,把基础字段和 SSL 变量一起组织起来:
- $remote_addr、$request、$status、$body_bytes_sent:保留标准访问日志核心字段
- $ssl_protocol/$ssl_cipher:显示协商出的 TLS 版本与加密套件,例如 TLSv1.3/ECDHE-ECDSA-AES128-GCM-SHA256
- "$ssl_server_name":记录客户端通过 SNI 发送的目标域名,对多域名 HTTPS 服务很关键
- $ssl_session_reused:用 r 或 . 标识会话是否复用,便于评估 TLS 性能优化效果
示例配置:
log_format ssl_full '$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';仅在 HTTPS server 块中启用该日志
确保 access_log 指令只出现在明确声明 listen 443 ssl; 的 server 块内:
- HTTP 的 server 块里不要写同一行 access_log,否则 SSL 变量会留空或显示短横线,污染日志可读性
- 日志路径(如 /var/log/nginx/ssl_access.log)需提前创建,且 Nginx worker 进程有写权限(常用 chown nginx:nginx /var/log/nginx)
- 若同时支持 HTTP/2,可加入 $http2 变量,值为 h2 表示启用,空则为 HTTP/1.1
确认 SSL 模块可用且配置无遗漏
以下三点任一缺失都会导致 SSL 变量始终为空:
- 运行 nginx -V 2>&1 | grep with-http_ssl_module,必须有输出,说明模块已编译启用
- server 块中的 listen 指令必须带 ssl 关键字,写成 listen 443 ssl http2; 才有效
- 不要在日志格式中误用未启用的功能变量,比如 $ssl_client_cert 仅在配置了双向认证(ssl_verify_client on)后才有意义
验证日志是否真正生效
完成配置后执行两步操作:
- 先运行 nginx -t 检查语法,再用 nginx -s reload 平滑重载
- 用 curl 或浏览器访问 HTTPS 地址,然后查看日志文件,典型成功条目类似:
203.0.113.5 - - [16/Sep/2026:13:15:22 +0000] "GET /health HTTP/2" 200 57 "-" "curl/8.10.1" TLSv1.3/ECDHE-ECDSA-AES128-GCM-SHA256 "api.example.com" r
其中状态码(200)、协议(HTTP/2)、TLS 版本与套件、SNI 域名、会话复用标记全部清晰可见,说明配置已就绪。


















