- 建站运维
一、先搞懂Nginx日志里都记了啥
我自己站点默认的日志格式是$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time,核心字段就这几个:
- remote_addr:访问者IP
- request:请求的URL和方法
- status:HTTP状态码
- body_bytes_sent:发送给客户端的字节数
- http_user_agent:客户端UA,用来识别是浏览器还是爬虫
- request_time:请求处理时间,单位秒,这个是排查慢请求最关键的字段。
二、几个直接能用的排查命令
我平时排查都是从这几个命令入手,不用装复杂的日志分析工具:
- 看访问量最高的IP:是不是有爬虫疯狂爬
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
如果某个IP一秒钟请求几十上百次,那基本就是爬虫或者恶意请求,直接deny掉就行。
- 找最慢的请求:看看哪个接口拖慢了整体速度
awk '{print $NF,$7}' /var/log/nginx/access.log | sort -nr | head -20
这里$NF是最后一个字段也就是request_time,按时间倒序排,前几个就是最慢的请求,我之前就是用这个命令找到了一个没加缓存的分类页,一次请求要3秒多,加完缓存整个站速度直接提上来了。
- 看最多的404请求:是不是有人在扫漏洞
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
如果出现大量wp-login.php、phpmyadmin这类你站点根本不存在的路径,就是有人在扫通用漏洞,直接封IP或者加WAF规则就行。
三、日志排查的小技巧
- 别等出问题才看日志,平时可以每天凌晨定时切割日志,避免单个日志文件太大打不开;
- 如果站点用了CDN,记得日志格式里要加http_x_forwarded_for获取真实IP,不然看到的都是CDN节点IP,白排查;
- request_time超过1秒的请求都值得重点看,正常静态文件请求应该在几十毫秒以内。





