Apache TLS日志需分层配置:错误类信息强制记入error_log,握手失败仅在此记录;成功连接后,mod_log_config通过%{SSL_PROTOCOL}x等变量记录会话信息;HTTP/2需用%H或%{HTTP2}e识别。

Apache TLS 配置中的日志记录,核心不是“打开一个开关”,而是分场景、分层级地配置:错误类信息必须走 error_log,协议/握手细节靠 LogLevel 控制粒度,而请求级 TLS 信息(如协议、密钥交换)可由 mod_log_config 记入访问日志——但前提是连接已成功建立。
SSL/TLS 握手失败的错误码只能记在 error_log
握手失败(比如证书过期、SNI 不匹配、TLS 版本太低)时,请求根本没进入 HTTP 处理流程,mod_log_config 完全不触发。唯一能捕获 OpenSSL 错误码的地方是 Apache 的 error_log:
- 在主配置或对应
VirtualHost中设置:LogLevel info ssl:warn(调试阶段可用debug ssl:debug) - 确保
ssl:debug显式写出,仅LogLevel debug不生效 - 在
error_log文件中查找含SSL_do_handshake() failed或SSL Library Error: error:1417D18D的行 - 用
openssl errstr 1417D18D解析具体含义
每个站点必须配独立的 SSL 错误日志路径
HTTP 和 HTTPS 是两个独立的 VirtualHost 块,不能共用日志:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
<VirtualHost *:80>块里写:ErrorLog /var/log/apache2/site-a-http-error.log -
<VirtualHost *:443>块里必须单独写:ErrorLog /var/log/apache2/site-a-ssl-error.log - 路径用绝对地址,目录需提前创建并授权给
www-data(或对应运行用户) - 配合
ErrorLogFormat "[%t] [%l] [pid %P:tid %T] %v: %M",让每条日志带虚拟主机名,方便归因
成功连接后,用 mod_log_config 记录 TLS 会话信息
一旦 TLS 握手成功、HTTP 请求被派发,mod_log_config 就能通过 %{...}x 变量记录会话上下文:
-
%{SSL_PROTOCOL}x→ 记录协商出的协议(如 TLSv1.3) -
%{SSL_CIPHER}x→ 记录使用的加密套件(如 ECDHE-ECDSA-AES128-GCM-SHA256) -
%{SSL_SERVER_S_DN_CN}x→ 服务端证书 CN(常用于多域名识别) -
%{SSL_CLIENT_VERIFY}x→ 若启用双向认证,显示 SUCCESS/FAILED - 把这些变量加入
LogFormat,例如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" ssl_combined
HTTP/2 和协议版本也要分开看
TLS 层之上还有应用层协议协商(ALPN),需额外关注:
- 启用
mod_http2后,用%H格式符准确记录实际协议(HTTP/1.1或HTTP/2.0) -
%{HTTP2}e环境变量可简单标记是否为 HTTP/2 连接(值为on或空) - HTTP/3 目前 Apache 2.4.x 无原生支持字段,不可靠的变通方式是解析
%{SSL_PROTOCOL}x+ ALPN 字符串匹配 - 验证方法:用
curl --http2 -I https://yoursite.com对比日志中%H输出

















