一、先说明两件事
- 日志压缩:靠 Apache 自带 rotatelogs 做日志切割 + 自动压缩,按天 / 按大小分割旧日志并打包 gz。
- 日志加密:Apache 本身不直接加密日志文件,通用方案:
- 方式 1:日志切割后用 gpg 自动加密
- 方式 2:系统层面目录加密(LUKS / 加密文件夹)
下面给你可直接落地的生产配置,Windows + Linux 都有。
二、核心工具:rotatelogs
Apache 自带日志轮转工具,语法:
plaintext
rotatelogs 日志路径 切割大小(秒) 偏移时间
1、虚拟主机配置:按天切割 + 自动压缩(Linux)
原理
每天生成一个独立日志,隔天自动归档压缩,每个虚拟主机日志隔离。
apache
<VirtualHost *:80>
ServerName www.site1.com
DocumentRoot /var/www/site1
# 错误日志:按天切割
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/site1-error-%Y%m%d.log 86400 480"
# 访问日志:按天切割
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/site1-access-%Y%m%d.log 86400 480" combined
</VirtualHost>
参数解释:
86400= 24 小时按天切割%Y%m%d自动拼接年月日,每天一个日志文件
配合 logrotate 实现自动压缩
Linux 用系统
logrotate,隔天自动把旧日志压缩为 .gz
新建配置 /etc/logrotate.d/apache-site1
plaintext
/var/log/httpd/site1-*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 root root
}
compress:启用 gzip 压缩rotate 30:保留最近 30 天日志delaycompress:隔一天再压缩,避免正在写入的日志被锁
生效:
bash
运行
logrotate -d /etc/logrotate.d/apache-site1 # 测试
logrotate /etc/logrotate.d/apache-site1 # 强制执行
2、Windows XAMPP 虚拟主机 日志切割 + 压缩
Windows Apache 也自带
rotatelogs.exeapache
<VirtualHost *:80>
ServerName www.site1.com
DocumentRoot "D:/xampp/htdocs/site1"
ErrorLog "|D:/xampp/apache/bin/rotatelogs.exe D:/xampp/apache/logs/site1-error-%Y%m%d.log 86400"
CustomLog "|D:/xampp/apache/bin/rotatelogs.exe D:/xampp/apache/logs/site1-access-%Y%m%d.log 86400" combined
</VirtualHost>
效果:每天生成
site1-error-20260429.logWindows 自动压缩
用 7-Zip 写批处理定时任务:
- 写
.bat遍历旧日志压缩为 7z/gz - 系统计划任务每天凌晨执行
三、日志加密 两种可行方案
方案 1:日志切割后 GPG 加密(推荐)
适合 Linux,日志压缩完自动加密,只有私钥能解密。
- 安装 gpg
bash
运行
yum install gnupg -y
- 建立密钥对
bash
运行
gpg --gen-key
- 写 shell 脚本,遍历
/var/log/httpd/下.log.gz自动加密、删除原文件 - 加入定时任务 crontab 每天执行
方案 2:目录加密(最简单)
- Linux:用 LUKS 加密分区,把 Apache 日志目录挂在加密分区
- Windows:用 BitLocker / 压缩加密文件夹,存放日志目录
方案 3:Apache 层面不加密,应用层脱敏
日志中隐藏手机号、密码、敏感参数,从源头保护。
四、关键总结
- 日志分割:用 Apache 内置
rotatelogs,每个虚拟主机独立按天生成日志。 - 日志压缩:Linux 用
logrotate + compress自动 gzip;Windows 用计划任务 + 7-Zip。 - 日志加密:Apache 不原生支持,靠 GPG 文件加密 / 系统目录加密 实现。
- 每个虚拟主机单独写
ErrorLog/CustomLog+ 管道调用 rotatelogs,站点日志完全隔离。