Nginx日志堪称Web服务器的“数字日记”,每一条记录都详细记载了访问者的IP、时间与行为。这些看似枯燥的文本,不仅是排查故障的利器,更是识别恶意访问、阻断攻击的第一手证据。下面介绍的几种方法,虽是日志分析领域的“经典套路”,但真正熟练掌握并灵活运用于实战的人并不多。

监测访问频率:揪出“高频刷屏”的IP
若某个IP在短时间内发起大量请求,极有可能是扫描器、CC攻击或恶意爬虫在作祟。如何快速定位?借助awk与grep组合命令,即可筛选出过去一小时内访问次数超过10次的异常IP:awk '{print $1}' access.log | grep -E "^(..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../..../../)" | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10检查请求方法:警惕非标准HTTP方法
常见GET、POST请求无伤大雅,但TRACE、TRACK、CONNECT等非常规方法,普通用户几乎不会用到。一旦出现,往往意味着攻击者正在探测服务器漏洞。只需一行grep即可快速过滤:grep -E "^(TRACE|TRACK|CONNECT)" access.log分析请求URI:识破“翻箱倒柜”的试探
恶意访问者常通过扫描敏感路径寻找突破口,比如/etc/passwd、/wp-config.php等文件。这些请求本身即表明攻击意图:grep -E "/(etc/passwd|etc/shadow|wp-config.php)" access.log解读HTTP状态码:错误码背后的线索
大量404不一定是坏事,但若同一IP频繁产生404,很可能是盲目扫描路径;而500错误则可能暗示攻击导致服务异常。通过awk统计状态码分布,快速发现异常:awk '{print $9}' access.log | grep -E " 404 | 500 "分析User-Agent:撕下伪装者的“面具”
许多扫描器、爬虫会伪造User-Agent字符串,但其中包含bot、spider、crawl、scan等关键词的请求,往往不是正常用户行为。使用awk提取第6个字段(UA)并过滤:awk '{print $6}' access.log | grep -E "bot|spider|crawl|scan"检查Referer:揪出“伪造来源”的猫腻
盗链、恶意爬虫常通过伪造Referer绕过防盗链设置。如果你维护了白名单域名,直接比对即可发现异常——无效的Referer一眼就能识别:awk '{print $7}' access.log | grep -E "^(http|https)://(www.)?example.com"
以上六招,基本覆盖了常见的恶意访问识别场景。发现可疑线索后,该封禁IP封禁IP,该限速限速。当然,日志分析并非一劳永逸——养成定期查看日志的习惯,才能让那些藏在暗处的攻击行为无处遁形,真正筑牢Web服务器的安全防线。
