直接在LogFormat中使用%{X-Real-IP}i可准确记录真实客户端IP,需前端Nginx配置proxy_set_header X-Real-IP $remote_addr;,并配合CustomLog引用该格式,同时过滤健康检查与内网请求以保障统计准确性。

直接在 LogFormat 中使用 %h 就能记录客户端 IP,但若网站前端有代理(如 Nginx、CDN 或负载均衡),%h 会变成代理的 IP,而非真实用户 IP。要准确记录真实客户端 IP,关键不是“要不要记”,而是“记哪个字段”和“是否可信”。
确认你真正需要的 IP 是哪个
Apache 默认用 %h 记录与它直连的客户端 IP。如果请求经过一层或多层代理,这个 IP 往往是最后一跳代理(比如 Nginx 或 HAProxy)的内网地址,不是访客真实出口 IP。此时需依赖代理传递的 HTTP 头:
-
%{X-Real-IP}i:Nginx 常用,只要配置了
proxy_set_header X-Real-IP $remote_addr;,该头通常最可靠 -
%{X-Forwarded-For}i:格式为
X-Forwarded-For: 203.122.45.67, 192.168.10.5,真实 IP 在最左边;但该头易被伪造,仅在可信代理链下可用 - %{CF-Connecting-IP}i:Cloudflare 用户可直接用,无需额外设置,比 X-Forwarded-For 更安全
- %{True-Client-IP}i:Akamai、部分 WAF 提供,需确认上游是否启用
定义并启用新日志格式
编辑 httpd.conf 或虚拟主机配置,在任意位置添加:
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" realip_combined
CustomLog "logs/access_real.log" realip_combined
注意两点:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
LogFormat 名称必须与 CustomLog 引用的名称完全一致(如这里的
realip_combined) - 日志路径
logs/access_real.log是相对路径,以 Apache 的 ServerRoot 为基准;也可写绝对路径,如/var/log/apache2/real_ip.log
避免无效或干扰记录
健康检查、爬虫探测、内网探测等请求会污染日志,影响 IP 统计质量。可通过环境变量过滤:
- 屏蔽常见探针路径:
SetEnvIf Request_URI "^/health|^/ping|^/status" dontlog - 排除日志记录:
CustomLog "logs/access_real.log" realip_combined env=!dontlog - 过滤内网 IP(可选):
SetEnvIf Remote_Addr "^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\." internal,再配合env=!internal
验证是否生效
重启 Apache 后,用 curl 模拟带真实 IP 的请求:
curl -H "X-Real-IP: 203.122.45.67" http://your-domain.com/
然后查看日志文件,确认首字段是否为 203.122.45.67。若仍显示代理 IP 或出现 -,说明对应请求头未被传递或名称不匹配(注意大小写和拼写,如 X-Real-Ip 无效)。

















