nginx log文件最佳配置

1. 日志格式优化

推荐使用组合格式记录关键信息,并启用压缩节省空间:
# 主日志格式(包含请求时间、IP、URL、响应时间等)
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';

# 静态资源访问日志(减少不必要字段)
log_format static '$remote_addr - [$time_local] "$request" '
                  '$status $body_bytes_sent $request_time';
 

2. 按业务拆分日志

将不同类型的请求分开记录,便于后续分析:
http {
    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log warn;
    
    # 静态资源日志
    location ~* \.(js|css|png|jpg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        access_log /var/log/nginx/static.log static;
    }
    
    # API 接口日志
    location /api/ {
        access_log /var/log/nginx/api.log main;
    }
    
    # 管理后台日志
    location /admin/ {
        access_log /var/log/nginx/admin.log main;
    }
}
 

3. 动态控制日志开关

通过变量动态控制是否记录日志,减少非必要日志:
http {
    # 定义变量:跳过健康检查请求的日志
    map $request_uri $loggable {
        default 1;
        ~*/healthcheck 0;
    }
    
    access_log /var/log/nginx/access.log main if=$loggable;
}
 

4. 错误日志配置

设置适当的错误日志级别,并监控关键错误:
error_log /var/log/nginx/error.log warn;  # 推荐使用 warn 级别

# 监控特定错误(示例:记录所有 500 错误)
server {
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        access_log off;  # 关闭错误页面的访问日志
    }
}
 

5. 日志轮转配置

使用 logrotate 定期切割日志,避免单个文件过大:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily               # 每天切割一次
    missingok           # 日志文件不存在时不报错
    rotate 30           # 保留 30 天的日志
    compress            # 压缩旧日志
    delaycompress       # 延迟压缩,避免当前日志被压缩
    notifempty          # 空日志不切割
    create 0640 nginx adm  # 创建新日志文件,设置权限和所有者
    sharedscripts       # 所有日志处理完成后只执行一次脚本
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
 

6. 性能优化建议

  • 异步写入:使用 access_log /path/to/log buffer=32k flush=5m; 减少磁盘 IO
  • 关闭不必要日志:静态资源、健康检查等可关闭或简化日志
  • 定期清理:结合 logrotate 和自动化脚本删除过期日志
  • 监控分析:集成 ELK Stack 或 Prometheus 进行实时监控和分析

通过以上配置,可在保证日志完整性的同时,提升性能并简化后续分析工作。根据实际业务需求,你还可以进一步定制日志格式和存储策略。
 
nginx 最佳配置防止log文件将硬盘空间占满
 
要防止 Nginx 的 log 文件占满硬盘空间,除了前面提到的日志轮转配置外,还可以从以下几个方面进行优化:

  • 优化日志格式:精简日志格式,只记录关键信息。例如:
log_format concise '$remote_addr - $time_local "$request" $status';
access_log /var/log/nginx/access.log concise;
 这样的配置只记录了客户端 IP、请求时间、请求内容和响应状态码,减少了不必要的字段,从而减小日志文件的大小。
  • 按条件记录日志:可以根据某些条件来决定是否记录日志,比如对健康检查请求不记录日志。示例如下:
map $request_uri $loggable {
    default 1;
    ~*/healthcheck 0;
}
access_log /var/log/nginx/access.log main if=$loggable;
 
  • 限制日志文件大小:使用 max_size 指令限制日志文件的大小,当文件达到指定大小时,Nginx 会自动切换到新的日志文件。例如:
access_log /var/log/nginx/access.log main max_size=100m;
error_log /var/log/nginx/error.log warn max_size=50m;
 
  • 合理设置日志目录:将日志文件存储到独立的分区或磁盘上,避免与系统文件或其他重要数据存放在一起,防止日志占满根分区空间4。同时,确保日志目录所在的文件系统有足够的空间来容纳日志文件的增长。
  • 定期清理或归档日志:可以使用脚本结合 cron 定时任务来删除过期的日志文件,或者将旧日志归档到其他存储介质上,如磁带、网络存储等。例如,每天凌晨 2 点删除 7 天前的日志文件,可以在 crontab 中添加如下任务:
0 2 * * * find /var/log/nginx -type f -mtime +7 -exec rm -f {} \;
 
 
 
 
 
 
 
 
 
 

  • 监控磁盘空间和日志增长4:使用监控工具如 Prometheus+Grafana、Zabbix 等监控磁盘空间使用情况,并设置告警阈值,当磁盘使用超过一定比例(如 80%)时发出警报,以便及时采取措施。同时,关注日志文件的增长趋势,根据业务量的变化适时调整日志管理策略。
posted @ 2025-06-02 23:52  奶牛的没有  阅读(327)  评论(0)    收藏  举报