每个虚拟主机必须单独配置errorlog和customlog指令,使用绝对路径、域名标识命名、自定义vcombined日志格式,并独立轮转;https站点需在*:443块中重复配置,否则日志混用无法定位问题。
每个虚拟主机必须单独配置 errorlog 和 customlog 指令,路径用绝对地址,格式需区分域名,轮转机制也要独立——否则所有站点日志混在一起,出问题根本没法定位。
每台虚拟主机显式声明日志路径
不能依赖主配置的默认日志设置。只要 <virtualhost></virtualhost> 块里没写 ErrorLog 和 CustomLog,Apache 就会复用全局配置,导致多个站点日志写进同一个文件。
- 路径必须是绝对路径,例如
/var/log/apache2/example.com-error.log,不能写logs/example.com-error.log(后者会相对于ServerRoot,容易误判) - 目录要提前创建好:
sudo mkdir -p /var/log/apache2/example.com - 确保 Apache 进程用户(如
www-data或apache)对日志目录有写权限,否则启动时报Permission denied
使用带域名标识的日志命名与格式
日志文件名建议带上域名前缀,比如 example.com-access.log,避免重名和权限冲突;日志内容也要能准确反映是哪个虚拟主机产生的请求。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 别直接用
combined格式,它不记录Host头,在 HTTPS 多站共 IP 场景下无法区分来源 - 在主配置中定义新格式:
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vcombined -
%v表示匹配到的ServerName或ServerAlias,比%{Host}i更可靠(后者可被客户端伪造) - 在虚拟主机内启用:
CustomLog /var/log/apache2/example.com-access.log vcombined
为每个虚拟主机配独立日志轮转
所有虚拟主机共用一个日志文件时,logrotate 或 rotatelogs 切分后,Apache 仍往旧文件句柄写,新日志就丢了。必须按虚拟主机粒度分开处理。
- 用
rotatelogs:写成CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/example.com-access.%Y%m%d.log 86400" vcombined - 用
logrotate:每个日志单独配一个配置文件,如/etc/logrotate.d/apache-example.com,内容包含create 644 www-data www-data和postrotate ... reload ... endscript - 不要把多个日志路径塞进同一个 logrotate 配置块——Apache 不支持单次 reload 刷新多个日志句柄
HTTPS 虚拟主机别漏掉 ErrorLog
HTTP 和 HTTPS 的 <virtualhost></virtualhost> 是两个独立块,HTTPS 站点如果没单独写 ErrorLog,错误仍会打到主配置的错误日志里,排查 SSL 握手失败、证书问题时会找不到线索。
- 哪怕和 HTTP 站点共用同一组日志路径,也要在
<virtualhost></virtualhost>里再写一遍ErrorLog和CustomLog - 确保
SSLEngine on和证书路径配置正确,否则httpd -t检查会报错,日志也写不进去










