宝塔面板中access.log显示的IP可能是CDN节点IP而非真实用户IP,需检查Nginx日志格式是否使用$http_x_real_ip或$http_x_forwarded_for,并确保上游透传该头;统计真实IP应使用awk命令提取对应字段,注意IPv6排序和日志滚动处理。

宝塔面板怎么看 access.log 里的真实 IP
宝塔默认用 Nginx,但如果你启用了 CDN、反向代理或开启了 proxy_set_header X-Real-IP,access.log 里记录的可能是 CDN 节点 IP,不是用户真实 IP。直接看日志会误判流量来源。
- 先确认 Nginx 日志格式是否包含
$remote_addr(原始连接 IP)还是$http_x_real_ip(转发来的 IP)——查配置:/www/server/panel/vhost/nginx/你的站点.conf,找log_format行 - 推荐改用
$http_x_forwarded_for或$http_x_real_ip,但前提是上游(如 CDN)确实透传了该头;否则 fallback 到$remote_addr - 常见错误:没改日志格式就直接分析,结果 top IP 全是腾讯云 CDN 的
119.29.x.x或阿里云的100.100.x.x,毫无业务意义
用 awk + sort 快速统计 IP 出现次数
别打开日志文件手动翻,也别依赖宝塔“日志搜索”那个卡顿的 Web 界面。终端一行命令就能跑出前 20 访问 IP:
awk '{print $1}' /www/wwwlogs/你的域名.log | sort | uniq -c | sort -nr | head -20
注意:$1 是日志第一列,但前提是你的 log_format 第一项确实是 IP(比如 log_format main '$remote_addr ...')。如果用了 X-Forwarded-For,得先用 awk -F'"' '{print $2}' | awk '{print $1}' 提取第一个 IP。
- 如果日志里有 IPv6 地址(形如
240e::123),sort默认按字典序排,可能把192.168.1.100排在192.168.1.2后面——加-V参数(sort -Vr)更稳妥 - 日志滚动后(比如
your.log.1.gz),记得用zcat解压再管道处理,别漏掉昨天的流量
宝塔自带“安全”模块的 IP 统计不准在哪
宝塔「安全」→「IP 防御」里显示的“访问次数”,其实是基于实时 Nginx 连接状态和简单规则拦截日志,不是从 access.log 解析出来的。它不统计静态资源(如 .js、.png)、不区分 GET/POST、也不合并同一 IP 多次请求——所以数字常比你用 awk 算的少一半。
- 它的作用是快速拉黑高频恶意 UA 或扫描行为,不是做流量分析用的
- 开启“CC 防御”后,部分请求根本不会进 access.log(被模块提前拦截),但会被记到安全模块里,造成数据割裂
- 想看真实用户分布?绕开这个界面,直接读日志 + 做 UA 过滤(比如去掉
HeadlessChrome、python-requests)
统计带时间窗口的 IP 流量(比如每小时 TOP10)
单纯看“总访问 IP”意义有限。攻击可能集中在凌晨 3 点,而正常用户活跃在下午——这时候需要切时间片分析。
awk '$4 ~ /\[24\/Mar\/2026:14:/ {print $1}' /www/wwwlogs/你的域名.log | sort | uniq -c | sort -nr | head -10
上面这行提取的是 “2026-03-24 14 点”的所有 IP(注意 Nginx 默认日志时间格式为 [24/Mar/2026:14:22:01 +0800])。关键点在于:$4 是时间字段,用正则匹配比字符串截取更稳。
- 时间字段位置固定,但不同 log_format 可能不同:用
head -1 your.log看一眼就知道$4对不对 - 如果要跨多小时或跨天统计,建议先用
sed -n '/24\/Mar\/2026:1[4-6]/p' your.log提前过滤,避免 awk 处理全量日志拖慢速度 - 别用宝塔“日志切割”功能自动删旧日志——有些攻击行为要回溯 7 天才能发现规律,至少保留最近 5 份 .log 和 .log.1.gz

















