网站 404 请求数量突然暴增,这通常不是什么好兆头。在主机选的长期运维经验中,这种情况大多意味着有人在恶意扫描你的站点寻找漏洞,或者网站存在大量死链被爬虫抓取。面对海量日志,靠肉眼去排查既低效又容易漏掉关键信息。这时候利用 AI Agent 自动化分析 Nginx 日志,能快速锁定攻击源和异常 URL,把运维从繁琐的数据清洗中解放出来。

网站 404 暴增意味着什么?
服务器负载正常,但带宽和 IOPS 突然升高,看日志全是 404,基本可以判定是遭遇了自动化工具扫描。攻击者通常会用字典遍历常见的后台地址(如 `/wp-admin.php`、`/phpMyAdmin`)或者特定漏洞路径。另一种情况是程序改版后旧接口未处理,导致爬虫(如 Googlebot、BaiduSpider)疯狂抓取死链,消耗服务器资源。
无论是哪种情况,单纯的 404 状态码不足以说明问题,必须结合“请求 URL”和“来源 IP”一起看。如果某个 IP 短时间内请求了大量不存在的资源,这就是典型的扫描特征,需要立刻处理。
AI Agent 运维思路
传统的做法是写 Shell 脚本配合 `grep`、`awk` 统计,再配合 `fail2ban` 封禁。但这套流程对规则依赖很重,攻击者稍微变一下路径特征(比如把 `.php` 改成 `.php5`),规则就可能失效。
引入 AI Agent 的逻辑是“理解”而非“匹配”。让 Agent 读取 Nginx 日志片段,它不仅能统计出高频 IP,还能识别出这些 URL 的意图——是 SQL 注入尝试、还是 XSS 探测、亦或是普通的资源抓取。基于 AI 的判断结果,再决定是直接封禁 IP,还是仅仅记录警告。
Nginx 日志分析与 Agent 部署
这套方案不需要复杂的编程环境,只要你的 VPS 能安装 Python 和 Docker 即可。我们用 Python 脚本做日志预处理,提取关键信息交给 LLM(如 DeepSeek、GPT-4o-mini)做决策。
Nginx 日志格式检查
确保你的 Nginx 配置中开启了日志记录,并且格式包含请求时间、请求方法、URL、状态码和来源 IP。默认的 `combined` 格式通常够用,但建议确认一下 `/etc/nginx/nginx.conf` 中的 `log_format` 配置。
cat /etc/nginx/nginx.conf | grep log_format
如果日志里没有 `$request_body` 或 `$http_user_agent`,分析攻击Payload时会稍微吃力,但统计 404 暴增足够了。
编写日志预处理脚本
直接把几 GB 的日志文件扔给 LLM 既贵又慢。我们需要一个中间脚本,先筛选出最近 10 分钟内的 404 日志,并按 IP 分组统计。
创建一个 `log_analyzer.py`:
python
import re
from collections import Counter
from datetime import datetime, timedelta
LOG_FILE = '/var/log/nginx/access.log'
def parse_log(line):
pattern = r'(?P<ip>\d+\.\d+\.\d+\.\d+).*?\[(?P<time>.*?)\].*?"(?P<method>\w+) (?P<path>.*?) .*?" (?P<status>\d+)'
match = re.search(pattern, line)
if match:
return match.groupdict()
return None
def analyze_404():
error_urls = []
ips = []
ten_min_ago = datetime.now() – timedelta(minutes=10)
with open(LOG_FILE, 'r') as f:
for line in f:
data = parse_log(line)
if not data: continue
if data['status'] == '404':
error_urls.append(data['path'])
ips.append(data['ip'])
top_ips = Counter(ips).most_common(5)
top_urls = Counter(error_urls).most_common(5)
return top_ips, top_urls
if __name__ == "__main__":
ips, urls = analyze_404()
print(f"Top IPs: {ips}")
print(f"Top URLs: {urls}")
运行这个脚本,能快速拿到最“活跃”的几个 IP 和它们在访问什么。
接入 LLM 进行智能研判
拿到数据后,通过 Python 调用 LLM API。构造 Prompt 很关键,要明确告诉 AI 它的角色。
python
import requests
API_KEY = "YOUR_API_KEY" # 建议从环境变量读取
API_URL = "https://api.deepseek.com/v1/chat/completions" # 示例接口
def ask_ai(ips, urls):
prompt = f"""
我是一个服务器运维人员。检测到最近10分钟内网站 404 暴增。
Top 5 来源 IP: {ips}
Top 5 请求 URL: {urls}
请分析这些 URL 是否具有明显的攻击特征(如漏洞扫描、敏感目录探测)?
如果是攻击,请返回 JSON 格式:{{"is_attack": true, "reason": "…", "banned_ips": […]}}。
如果是爬虫抓取死链,返回:{{"is_attack": false, "advice": "…"}}。
"""
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
data = {"model": "deepseek-chat", "messages": [{"role": "user", "content": prompt}]}
response = requests.post(API_URL, json=data, headers=headers)
return response.json()['choices'][0]['message']['content']
自动化封禁与重载
AI 返回 `is_attack: true` 后,脚本调用系统命令封禁 IP。推荐使用 `iptables` 或直接写入 Nginx 的黑名单配置并重载。
python
import subprocess
def ban_ip(ip):
subprocess.run(['iptables', '-A', 'INPUT', '-s', ip, '-j', 'DROP'])
print(f"Banned IP: {ip}")
将上述逻辑组合,放入 `crontab` 每 10 分钟执行一次,或者在 Docker 容器中做成常驻进程,就形成了一个简单的 AI Agent 运维闭环。
老鸟叮嘱
这个方案虽然自动化程度高,但坑也不少。日志文件如果达到 GB 级别,Python 原生读取会非常慢,甚至撑爆内存。建议先使用 `logrotate` 切割日志,或者脚本里只读取 `tail -n 10000` 这样的最近行数。
另外,AI 判断并非 100% 准确。如果 CDN 节点的 IP 被判定为攻击源误封了,会导致全站瘫痪。封禁前最好加一层白名单校验,或者先封禁 5 分钟,观察情况再决定是否延长。
不要用 root 权限跑这个脚本,给 Docker 容器或运行用户分配最小的 `sudo` 权限,仅允许执行 `iptables -A` 和 `nginx -s reload`。API Key 千万别硬编码在脚本里,泄露了不仅钱没了,服务器也可能被反向控制。
FAQ
网站 404 暴增一定是被攻击了吗?
不一定。如果刚改版过网站,或者有外链引用了已删除的资源,搜索引擎爬虫会集中抓取这些死链。如果来源 IP 是 Google 或 Baidu 的官方爬虫段,通常不是攻击。
AI 分析日志会不会很贵?
取决于日志量和模型选择。只发送统计后的 Top 数据给轻量级模型(如 DeepSeek、GPT-4o-mini),单次分析成本极低,几乎可以忽略不计。
能不能直接用 fail2ban?
fail2ban 是基于正则规则的,对于已知的攻击特征非常有效且速度快。但如果攻击者使用了混淆或新的扫描路径,AI Agent 的泛化能力会比正则强,两者结合使用效果最好。
封禁 IP 后怎么解封?
脚本里最好加一个自动解封机制,比如封禁 24 小时后自动从 iptables 删除规则,或者每天定时清空临时封禁列表,避免误杀长期封禁。
Nginx 日志太大怎么办?
必须开启 logrotate,按天或按大小切割日志,并自动压缩旧日志。分析脚本只分析当天的 `access.log`,避免处理历史数据浪费算力。
如何验证 Agent 是否在工作?
建议脚本运行时将 AI 的分析结果和封禁动作写入到本地数据库(如 SQLite)或单独的日志文件 `/var/log/ai_agent.log`,定期查看这个文件确认 Agent 是否在正常决策。
AI Agent 赋予了服务器一定的“自我诊断”能力,让运维从被动救火转向主动防御。通过分析 Nginx 日志中的 404 异常,不仅能快速拦截恶意扫描,还能顺带清理网站死链,提升整体 SEO 表现。这套流程在 VPS 上跑起来并不复杂,关键在于控制好数据输入量和 API 成本,做到真正的自动化、智能化运维。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10269.html 商家投稿邮箱:zhujixuanblog@qq.com
