在 Debian 上,Nginx 日志压缩通常分 “运行中日志滚动压缩” 和 “历史日志手动/自动压缩” 两种情况。最常见、推荐的做法是用 logrotate。
Debian 下 Nginx 通常已经带有 logrotate 配置:
/etc/logrotate.d/nginx
默认内容类似:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
compress:启用压缩(默认 gzip)delaycompress:延迟一轮再压缩(避免正在写入的日志被压)compresscmd / compressext:可自定义压缩命令和扩展名例如改成 zstd 压缩(更高效):
compress
compresscmd /usr/bin/zstd
compressext .zst
uncompresscmd /usr/bin/unzstd
logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
执行后你会看到:
access.log.1
access.log.1.gz
如果你只是想压缩旧日志:
gzip /var/log/nginx/access.log.1
或批量:
gzip /var/log/nginx/*.log.*
查看压缩日志:
zcat /var/log/nginx/access.log.1.gz | head
logrotate 已包含:
postrotate
invoke-rc.d nginx rotate
endscript
这相当于:
nginx -s reopen
确保 Nginx 重新打开日志文件,而不是写旧文件。
只保留 7 天、每天压缩:
daily
rotate 7
compress
每月压缩一次:
monthly
rotate 12
compress
logrotate 通常由 cron 调用:
systemctl status cron
✅ 最佳实践:直接用 Debian 自带的 /etc/logrotate.d/nginx
✅ 压缩方式:compress(gzip / zstd)
✅ 不要手动 mv 日志后不 reload nginx
如果你是 Docker / Kubernetes / 自定义路径 Nginx,可以告诉我,我可以给你对应方案。