nginx 日志分析入门:找出慢请求与异常流量
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
nginx 日志是排查线上问题最直接的证据来源。无论你的业务跑在云服务器上,还是前面挂了 CDN 或 WAF,只要日志格式配置得当,就能快速定位慢请求、抓出异常流量。本文以最常见的 combined 格式为例,介绍几个实用的命令与分析思路。
一、确认日志格式与响应时间字段
默认 combined 格式只有 IP、时间、请求、状态码和 UA,没有响应耗时。建议在 http 块自定义:log_format main '$remote_addr [$time_local] "$request" $status $body_bytes_sent $request_time $upstream_response_time "$http_user_agent"';,然后在 server 块用 access_log /var/log/nginx/access.log main; 启用。其中 $request_time 是 nginx 从收到请求到发完响应的总耗时(秒),$upstream_response_time 是后端处理时间,两者相差大说明瓶颈在 nginx 自身(如传输慢、客户端弱网)。
二、用 awk 快速找出慢请求
假设日志按上面的格式,列出耗时超过 1 秒的前 20 条:awk '($5>1){print $5, $7}' access.log | sort -rn | head -20。再统计慢请求集中访问的 URI:awk '($5>1){print $7}' access.log | sort | uniq -c | sort -rn | head -10。如果慢请求集中在一两个接口,通常是慢 SQL 或接口本身阻塞;如果全站都慢,则要查 CPU、磁盘 IO 和带宽占用,可用 top、iostat -x 1 配合观察。
三、统计并定位异常流量
统计访问量最高的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20。正常用户分散,若某个 IP 在一小时内有几万次请求,基本可判定为爬虫或攻击。再看状态码分布:awk '{print $9}' access.log | sort | uniq -c,大量 404、444 或 5xx 需重点关注。进一步看被刷的 URI:awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10。确认后可在 nginx 中用 deny IP; 临时封禁,或加 limit_req_zone 做请求速率限制,例如 10MB 内存约可追踪 16 万个 IP 状态、限制每秒 10 次请求。
总结
日志分析三步走:先加 request_time 字段让耗时可度量,再用 awk 筛出慢请求找性能瓶颈,最后统计 IP 和状态码识别异常流量。建议把高频分析命令整理成脚本,配合定时任务每日输出报告。对于持续遭遇 DDoS 或 CC 攻击的站点,建议在源站前接入高防服务,让攻击流量在边缘被清洗,源站日志才能真实反映业务状况。