nginx的access_log需借助logrotate实现自动压缩与轮转,配置时应指定固定路径、合理权限,并在logrotate中设置daily、compress、postrotate等参数以确保日志归档与nginx重载协同正常。

在 Nginx 中,access_log 本身不支持自动压缩或轮转,需结合外部工具(如 logrotate)实现日志的定期压缩与归档。
配置 Nginx 写入标准 access_log
确保 Nginx 日志路径明确、权限合理,为后续轮转打好基础:
- 在
http或server块中指定日志路径,例如:access_log /var/log/nginx/access.log main; - 避免使用动态变量(如
$host)作为文件名主干,否则logrotate无法稳定识别和匹配日志文件 - 确认 Nginx 进程对日志目录有写入权限,且
logrotate执行用户(通常是root)能读取并重命名该文件
用 logrotate 管理日志轮转与压缩
logrotate 是 Linux 下最常用、最可靠的日志管理工具,支持按时间/大小轮转、压缩、删除旧文件等操作:
- 新建配置文件(如
/etc/logrotate.d/nginx),内容示例:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}-
daily:每天轮转一次;可替换为weekly或size 100M -
compress:启用 gzip 压缩(生成.log.1.gz等) -
delaycompress:延迟压缩上一轮日志(保留最新一轮明文,便于排查) -
postrotate段发送USR1信号,通知 Nginx 重新打开日志文件(避免写入已重命名的旧文件)
验证与调试 logrotate 行为
避免配置错误导致日志丢失或不压缩:
- 手动测试轮转:运行
logrotate -d /etc/logrotate.d/nginx(-d 查看模拟过程) - 强制执行一次:
logrotate -f /etc/logrotate.d/nginx,检查是否生成.gz文件及 Nginx 是否继续写新日志 - 确认
/var/log/nginx/下出现类似access.log.1.gz、access.log.2.gz的归档文件 - 检查 Nginx 错误日志(
error.log)有无 “open() failed” 类报错,常见于权限或postrotate未生效
替代方案:脚本 + cron(轻量场景)
若无法使用 logrotate(如某些容器环境),可用简单 Bash 脚本配合 cron:
- 编写压缩脚本(如
/usr/local/bin/nginx-log-rotate.sh):
#!/bin/bash
LOG_DIR="/var/log/nginx"
DATE=$(date -d "yesterday" +\%Y\%m\%d)
gzip "${LOG_DIR}/access.log"
mv "${LOG_DIR}/access.log.gz" "${LOG_DIR}/access.log.${DATE}.gz"
touch "${LOG_DIR}/access.log"
kill -USR1 $(cat /var/run/nginx.pid)- 添加定时任务:
0 0 * * * /usr/local/bin/nginx-log-rotate.sh - 注意:该方式缺少保留份数控制、异常处理和原子性保障,仅适用于低要求场景











