当前位置: 首页 > news >正文

如何分析 Nginx 日志

分析 Nginx 日志可以帮助我们了解服务器性能、流量来源、用户行为,以及诊断问题(如错误和攻击)。以下是详细的分析方法:


1. 日志类型

Nginx 有两种主要日志:

  • 访问日志 (Access Log):记录客户端对服务器的每个请求。
  • 错误日志 (Error Log):记录服务器运行中出现的错误。
访问日志格式

典型日志格式:

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

字段解释

  • $remote_addr: 客户端 IP 地址。
  • $remote_user: 认证的用户(如果有)。
  • $time_local: 本地时间。
  • $request: 请求方法、路径和协议。
  • $status: HTTP 状态码。
  • $body_bytes_sent: 发送的响应大小。
  • $http_referer: 请求的来源页面。
  • $http_user_agent: 客户端的 User-Agent 字符串。

2. 常见分析场景
(1) 流量分析

统计访问量、热门资源和请求来源:

  • 统计访问 IP

    awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
    

    说明:统计每个 IP 的访问次数。

  • 统计访问 URL

    awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
    

    说明:统计最常访问的路径。

  • 统计 Referer

    awk -F'"' '{print $4}' access.log | sort | uniq -c | sort -nr | head
    

    说明:查看流量来源。

(2) 状态码分析

找出出现错误的请求:

  • 统计状态码分布

    awk '{print $9}' access.log | sort | uniq -c | sort -nr
    

    说明:统计每种 HTTP 状态码的次数。

  • 筛选特定状态码请求(如 404 错误):

    awk '$9 == 404 {print $0}' access.log
    
(3) 排查慢请求

找出处理时间最长的请求(需要启用 $request_time$upstream_response_time 变量):

  • 按处理时间排序

    awk '{print $10 " " $7}' access.log | sort -nr | head
    

    说明:找到耗时最长的请求。

(4) 攻击检测
  • 检测频繁访问的 IP

    awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
    

    说明:可能是攻击者尝试暴力请求。

  • 检测恶意 User-Agent

    awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr | head
    
(5) 错误日志排查

查看 Nginx 错误日志,定位问题:

tail -f /var/log/nginx/error.log

结合时间、错误码和描述信息,找出具体问题(如后端服务连接失败、配置错误等)。


3. 工具辅助分析
日志切割工具

日志可能很大,按日期切割以便于管理:

  • 使用 logrotate 配置自动切割。

  • 手动切割:

    mv access.log access.log.$(date +%Y%m%d)
    systemctl reload nginx
    
分析工具
  • GoAccess(实时分析):
    安装后运行:

    goaccess /path/to/access.log --log-format=COMBINED -o report.html
    

    生成直观的 HTML 报告。

  • AWStats(流量统计):
    对 Nginx 访问日志进行详细的统计分析。


4. 性能优化思路

通过分析日志,发现问题后可采取以下措施:

  1. 高频 IP 限制
    配置 limit_req 或使用防火墙阻止恶意 IP。

    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
  2. 静态文件缓存
    减少重复请求对服务器的压力。

  3. 优化后端服务
    根据慢请求分析,优化后端接口或数据库查询。


5. 示例综合分析

假设你收到很多 502 错误,分析步骤:

  1. 查看错误日志中的时间点和原因:

    grep '502' /var/log/nginx/error.log
    
  2. 对比访问日志,找到 502 错误对应的请求和 IP:

    awk '$9 == 502 {print $1, $7}' access.log
    
  3. 检查后端服务是否正常,查看响应时间。

http://www.lryc.cn/news/516567.html

相关文章:

  • Kubernetes Gateway API-5-后端协议和网关基础设置标签
  • 大数据架构演变
  • Bash语言的软件工程
  • OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
  • CE中注册的符号地址如何通过编程获取
  • Math Reference Notes: 积分因子
  • 解决7-Zip图标更换问题
  • Java 性能监控工具详解:JConsole、VisualVM 和 Java Mission Control
  • 浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开
  • 用Python进行大数据处理:如何使用pandas和dask处理海量数据
  • 机器人手眼标定
  • 基于Springboot + vue实现的校园失物招领系统
  • 关于C语言初步的一些基础知识整理(2)
  • Linux驱动开发:深入理解I2C时序(二)
  • 逆向安卓抓包
  • Spring源码分析之事件机制——观察者模式(一)
  • QT实现 端口扫描暂停和继续功能 3
  • SHViT模型详解
  • QGIS Server安装部署教程
  • 基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
  • 【C语言】
  • 标题:利用Spring Boot构建JWT刷新令牌应用
  • 性能测试工具的原理与架构解析
  • 基于STM32的自动水满报警系统设计
  • C语言 数组编程练习
  • Windows 远程桌面连接Ubuntu操作 可以自由相互复制文件 粘贴板等
  • 链表OJ题(一)
  • C/C++中new/delete与malloc/free的区别及对象管理
  • 我的nvim的init.lua配置
  • 2025第1周 | JavaScript中的正则表达式