插件窝 干货文章 Nginx日志切割配置解析,管理网站日志存储

Nginx日志切割配置解析,管理网站日志存储

日志 Nginx logrotate 切割 286    来源:    2025-04-17

Nginx日志切割配置与管理指南

日志切割的必要性

Nginx默认不会自动分割日志文件,随着时间推移,访问日志和错误日志会变得非常庞大,导致: - 占用大量磁盘空间 - 日志分析困难 - 影响服务器性能 - 不便归档和备份

日志切割方案

方案一:使用logrotate工具(推荐)

logrotate是Linux系统自带的日志管理工具,配置简单可靠。

  1. 创建Nginx日志切割配置文件
sudo vim /etc/logrotate.d/nginx
  1. 添加以下内容(根据实际情况调整):
/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
}
  1. 配置说明

    • daily:每天切割日志
    • rotate 14:保留14份历史日志
    • compress:使用gzip压缩旧日志
    • delaycompress:延迟压缩前一个日志文件
    • create 0640 www-data adm:创建新日志文件并设置权限
    • postrotate:通知Nginx重新打开日志文件
  2. 测试配置

sudo logrotate -d /etc/logrotate.d/nginx  # 测试模式
sudo logrotate -f /etc/logrotate.d/nginx  # 强制执行

方案二:使用cron定时任务+custom脚本

  1. 创建日志切割脚本
sudo vim /usr/local/bin/nginx-logrotate.sh
  1. 脚本内容
#!/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 {} \;
  1. 设置脚本权限
sudo chmod +x /usr/local/bin/nginx-logrotate.sh
  1. 添加cron定时任务
sudo crontab -e

添加以下内容(每天凌晨执行):

0 0 * * * /usr/local/bin/nginx-logrotate.sh

Nginx日志配置优化

在Nginx配置文件中优化日志格式和存储:

  1. 自定义日志格式(在http块中添加):
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';
  1. 配置访问日志和错误日志(在server块中添加):
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分钟后写入文件

日志管理最佳实践

  1. 日志保留策略

    • 生产环境建议保留30-90天的日志
    • 开发环境可保留7-14天的日志
  2. 日志分析工具

    • GoAccess:实时日志分析工具
    • AWStats:详细的网站流量统计
    • ELK Stack:Elasticsearch + Logstash + Kibana 日志分析平台
  3. 日志监控

    • 设置错误日志监控,及时发现500错误等严重问题
    • 监控访问日志中的异常请求模式
  4. 日志存储优化

    • 对于高流量网站,考虑将日志存储在单独的分区或磁盘
    • 定期归档旧日志到冷存储或对象存储服务

通过合理配置日志切割和管理策略,可以有效维护服务器性能,同时保留足够的日志信息用于分析和故障排查。