apache日志记录cdn节点ip而非真实用户ip,需启用mod_remoteip模块、配置remoteipinternalproxy信任cdn ip段,并将logformat中的%h替换为%a以记录真实ip。

CDN 介入后,Apache 默认记录的是 CDN 节点 IP,不是用户真实 IP。要让访问日志体现真实客户端 IP,核心是两件事:一是确保 CDN 正确携带 X-Forwarded-For 头,二是 Apache 日志格式和模块配置能安全提取并使用它。
确认 CDN 已传递 X-Forwarded-For 头
所有主流 CDN(Cloudflare、腾讯云、阿里云、百度云等)默认都会在请求头中添加 X-Forwarded-For,格式为:X-Forwarded-For: 203.124.56.78, 103.45.78.85, 192.168.1.10
其中最左边的 IP(逗号前第一个)就是客户端真实 IP。可通过简单 PHP 脚本验证:
- 在网站根目录新建
ipcheck.php,内容为:<?php print_r($_SERVER['HTTP_X_FORWARDED_FOR'] ?? '未收到 X-Forwarded-For'); ?> - 访问该页面,若返回一个合法公网 IP,说明 CDN 已正确透传;若为空或报错,需检查 CDN 控制台是否开启“传递客户端 IP”或“透传 XFF”开关。
启用 mod_remoteip 模块并配置可信代理
Apache 2.4+ 自带 mod_remoteip,它能将 X-Forwarded-For 中可信代理链里的首个有效 IP 替换为 %a 变量,比直接读取头更安全(防伪造)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 编辑 Apache 主配置(如
/www/server/apache/conf/httpd.conf或宝塔中“配置文件”) - 取消注释并启用模块:
LoadModule remoteip_module modules/mod_remoteip.so - 指定信任的 CDN 或反向代理 IP 段(必须填!否则不生效):
RemoteIPHeader X-Forwarded-ForRemoteIPInternalProxy 103.45.78.0/24RemoteIPInternalProxy 118.89.171.94
(替换成你实际使用的 CDN 节点 IP 或网段,可在 CDN 控制台查到官方 IP 列表)
修改日志格式使用 %a 替代 %h
%h 记录的是 TCP 连接发起方(即 CDN 节点),而启用 mod_remoteip 后,%a 就代表解析后的客户端真实 IP。
- 找到
LogFormat行(通常在httpd.conf或extra/httpd-vhosts.conf) - 将默认的
combined格式改为:LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - 确保虚拟主机中使用了该格式,例如:
CustomLog "/www/wwwlogs/your-site.log" combined
验证与注意事项
重启 Apache 后,立即访问网站,然后查看日志:tail -n 5 /www/wwwlogs/your-site.log
应看到类似这样的行:203.124.56.78 - - [13/Jun/2026:12:45:22 +0800] "GET / HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0..."
- 如果仍显示 CDN IP,请检查:
–RemoteIPInternalProxy是否填了正确的 CDN IP(不能漏、不能错)
– Apache 是否真的加载了mod_remoteip(可运行apachectl -M | grep remoteip确认)
– 日志中是否用了%a而非%h - 不建议仅靠
%{X-Forwarded-For}i直接写入日志,因为该头可能被恶意构造,缺乏校验。










