Nginx默认不会自动分割日志文件,随着时间推移,访问日志和错误日志会变得非常庞大,导致: - 占用大量磁盘空间 - 日志分析困难 - 影响服务器性能 - 不便归档和备份
logrotate是Linux系统自带的日志管理工具,配置简单可靠。
sudo vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
配置说明:
daily
:每天切割日志rotate 14
:保留14份历史日志compress
:使用gzip压缩旧日志delaycompress
:延迟压缩前一个日志文件create 0640 www-data adm
:创建新日志文件并设置权限postrotate
:通知Nginx重新打开日志文件测试配置:
sudo logrotate -d /etc/logrotate.d/nginx # 测试模式
sudo logrotate -f /etc/logrotate.d/nginx # 强制执行
sudo vim /usr/local/bin/nginx-logrotate.sh
#!/bin/bash
# Nginx日志目录
LOGS_PATH=/var/log/nginx
# 切割后的日志存放目录
CUT_LOGS_PATH=/var/log/nginx/history
# 获取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 创建历史日志目录
mkdir -p ${CUT_LOGS_PATH}
# 切割access.log和error.log
for LOGFILE in access error; do
if [ -f "${LOGS_PATH}/${LOGFILE}.log" ]; then
# 重命名日志文件
mv ${LOGS_PATH}/${LOGFILE}.log ${CUT_LOGS_PATH}/${LOGFILE}_${YESTERDAY}.log
# 压缩日志
gzip ${CUT_LOGS_PATH}/${LOGFILE}_${YESTERDAY}.log
fi
done
# 向Nginx主进程发送USR1信号,重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)
# 删除30天前的日志
find ${CUT_LOGS_PATH} -name "*.log.gz" -mtime +30 -exec rm -f {} \;
sudo chmod +x /usr/local/bin/nginx-logrotate.sh
sudo crontab -e
添加以下内容(每天凌晨执行):
0 0 * * * /usr/local/bin/nginx-logrotate.sh
在Nginx配置文件中优化日志格式和存储:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main buffer=32k flush=5m;
error_log /var/log/nginx/error.log warn;
参数说明:
- buffer=32k
:设置写入日志的缓冲区大小
- flush=5m
:缓冲区内容最长保留5分钟后写入文件
日志保留策略:
日志分析工具:
日志监控:
日志存储优化:
通过合理配置日志切割和管理策略,可以有效维护服务器性能,同时保留足够的日志信息用于分析和故障排查。