关键是要定制访问日志格式(如启用mod_remoteip、记录%D/%I/%{Referer}i)、按状态码与行为组合筛选失败请求(403/404/499等)、关联错误日志定位深层原因(如AH01630或AH00035错误),并建立日常监控习惯。

要在 Apache 中有效记录并分析失败的访问尝试,关键不是只看“404”或“500”,而是把所有异常请求行为纳入可观测范围——包括权限拒绝(403)、重定向循环、客户端中断(499)、代理头伪造、高频扫描等。这需要日志配置、筛选逻辑和排查路径三者配合。
一、让失败请求“留痕”:定制访问日志格式
默认 access.log 往往漏掉关键上下文,比如真实 IP 被 CDN 或 Nginx 代理掩盖,或无法区分是用户输错 URL 还是爬虫暴力探测。需主动增强记录能力:
- 启用
mod_remoteip模块,用RemoteIPHeader X-Forwarded-For提取真实客户端 IP,避免日志里全是 127.0.0.1 或代理 IP - 在
LogFormat中加入响应耗时(%D)、请求体大小(%I)、Referer 是否为空("%{Referer}i"),便于识别自动化工具(如 Referer 为空 + User-Agent 异常 + 高频 404) - 示例增强格式:
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %I %{X-Forwarded-For}i" detailed_fail
其中%a是远程地址(经 RemoteIP 解析后),比%h更可靠
二、聚焦“失败”本身:按状态码与行为分类筛选
失败不等于错误日志才有价值。访问日志中大量有价值线索藏在 HTTP 状态码和请求模式里:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
权限类失败:筛选
grep ' 403 ' /var/log/apache2/access.log,再结合awk '{print $1}' | sort | uniq -c | sort -nr | head -10查出高频触发 403 的 IP,判断是否为扫描器 -
资源不存在类:用
grep ' 404 ' | awk '{print $7}' | sort | uniq -c | sort -nr | head -5找出被反复请求却不存在的路径(如/wp-admin/、/phpmyadmin/),这是典型暴力探测特征 -
可疑行为组合:用
awk '$9 ~ /^4|5/ && $11 == "\"-\"" && $12 ~ /python|curl|masscan/ {print}'抓取“失败响应 + 无 Referer + 工具型 UA”的请求,基本可判定为恶意探测
三、关联错误日志定位深层原因
访问日志告诉你“谁在失败”,错误日志告诉你“为什么失败”。二者必须交叉验证:
- 当发现某 IP 在 access.log 中密集出现 500 错误时,立即查 error.log 中同一时间点附近是否有对应报错,例如:
tail -50 /var/log/apache2/error.log | grep -A2 -B2 "client 203.0.113.45" - 若错误日志出现
Permission denied: [client ...] AH00035: access to /admin/ denied,说明是<Directory>权限配置拦截,而非文件缺失;而File does not exist: /var/www/html/xxx.php则指向真实路径问题 - 对 403 场景,错误日志会明确写出拒绝来源,例如:
[authz_core:error] [pid 12345] [client 192.168.1.100] AH01630: client denied by server configuration→ 检查Require规则[core:error] [pid 12345] [client 192.168.1.100] AH00035: access to /protected/ denied due to missing or illegal credentials→ 检查认证配置
四、建立基础监控习惯:不依赖“出事才查”
被动排查效率低。建议日常做两件事:
- 每天用
awk '$9 > 400' /var/log/apache2/access.log.1 | wc -l快速统计昨日失败请求数量,趋势突增即预警 - 对高风险目录(如
/admin/、/api/)单独配置日志:SetEnvIf Request_URI "^/admin/" admin_access<br>CustomLog ${APACHE_LOG_DIR}/admin-fail.log detailed_fail env=admin_access
把相关失败请求集中落盘,方便专项分析
不复杂但容易忽略

















