温馨提示×

nginx centos 日志如何分析

小樊
44
2025-11-08 02:14:18
栏目: 智能运维

一、Nginx日志基础认知

在CentOS系统中,Nginx的日志主要分为两类,均位于/var/log/nginx/目录下:

  • access.log:记录客户端对服务器的所有请求,是分析流量、用户行为的核心依据;
  • error.log:记录Nginx运行中的错误信息(如配置错误、连接失败、权限问题),是故障排查的关键线索。

日志格式可通过log_format指令自定义,常见字段包括:$remote_addr(客户端IP)、$time_local(本地时间)、$request(请求方法+路径+协议)、$status(HTTP状态码)、$request_time(请求处理时间)、$http_user_agent(客户端UA)等。

二、常用日志分析场景与命令

1. 流量分析

  • 统计访问量最高的IP:提取access.log第1列(IP),排序去重并计数,取前10名。
    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
    
  • 统计热门URL:提取access.log第7列(请求路径),排序去重并计数,取前10名。
    awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
    
  • 分析流量来源:提取access.log第10列(Referer),统计来源域名分布。
    awk -F'"' '{print $4}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
    
  • 统计状态码分布:提取access.log第9列(状态码),查看HTTP状态码占比(如200成功、404未找到、500服务器错误)。
    awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
    

2. 性能分析

  • 查找慢请求:若日志中启用了$request_time字段(需在log_format中配置),可筛选处理时间超过1秒的请求,定位性能瓶颈。
    awk '$10 > 1' /var/log/nginx/access.log | sort -nr -k10 | head -n 10
    
    (注:$10$request_time的列号,需根据实际日志格式调整)

3. 错误排查

  • 筛选4xx/5xx错误:提取access.log中状态码为4xx(客户端错误)或5xx(服务器错误)的行,统计错误总数。
    awk '$9 ~ /^[45]/' /var/log/nginx/access.log | wc -l
    
  • 分析特定错误:如查找所有404错误(资源未找到),定位缺失的文件或路径。
    grep ' 404 ' /var/log/nginx/access.log
    
  • 查看错误日志:实时监控error.log,获取最新的错误信息(如连接上游服务器失败、权限不足)。
    tail -f /var/log/nginx/error.log
    
    (注:-f表示实时跟踪日志更新)

三、日志分析工具推荐

1. GoAccess(实时可视化)

GoAccess是一款开源的实时日志分析工具,可生成HTML报告,直观展示流量、状态码、Referer等信息。

  • 安装
    sudo yum install goaccess
    
  • 使用
    goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/nginx_report.html
    
    --log-format=COMBINED适配Nginx默认的Combined日志格式,-o指定输出HTML文件路径)

2. ELK Stack(高级分析与可视化)

ELK(Elasticsearch+Logstash+Kibana)适合大规模日志分析,支持全文搜索、趋势图表、告警等功能。

  • 简要步骤
    • 用Logstash采集Nginx日志(配置logstash.conf,解析access.logerror.log);
    • 将日志数据存储到Elasticsearch;
    • 通过Kibana创建Dashboard,可视化分析流量、错误、性能等指标。

四、日志轮转配置(避免磁盘爆满)

Nginx日志会持续增长,需通过logrotate工具定期轮转(切割)、压缩旧日志。

  • 默认配置:CentOS系统自带/etc/logrotate.d/nginx,内容如下:
    /var/log/nginx/*.log {
        daily          # 每天轮转
        missingok      # 若日志文件不存在也不报错
        rotate 14      # 保留14个旧日志文件
        compress       # 压缩旧日志(如access.log.1.gz)
        delaycompress  # 延迟压缩(不压缩最新的旧日志)
        notifempty     # 若日志为空则不轮转
        create 0640 www-data adm  # 创建新日志文件的权限和所有者
        sharedscripts  # 所有日志轮转完成后执行postrotate
        postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`  # 通知Nginx重新打开日志文件
        endscript
    }
    
  • 手动触发轮转
    logrotate -vf /etc/logrotate.d/nginx
    
    -v显示详细过程,-f强制轮转)

五、常见问题排查示例

1. 404错误定位

  • 步骤
    1. 筛选access.log中的404错误:grep ' 404 ' /var/log/nginx/access.log
    2. 提取错误URL:awk '{print $7}'
    3. 检查文件是否存在:ls -l /var/www/html/错误URL路径
    4. 若文件不存在,修复路径或返回404页面。

2. 500错误定位

  • 步骤
    1. 筛选access.log中的500错误:grep ' 500 ' /var/log/nginx/access.log
    2. 查看对应时间的error.loggrep '2025/11/08' /var/log/nginx/error.log(替换为错误发生时间);
    3. 根据error.log中的错误描述(如“Permission denied”“upstream timed out”),定位配置问题或上游服务器故障。

3. 上游服务器连接失败

  • 错误示例upstream timed out (110: Connection timed out)(连接上游服务器超时)。
  • 排查步骤
    1. 检查上游服务器是否启动:systemctl status backend_service
    2. 测试网络连通性:ping 上游服务器IPtelnet 上游服务器IP 8080
    3. 检查防火墙设置:iptables -L(确认未阻止Nginx与上游服务器的通信)。

0