使用 CDN 后 Apache 的日志记录客户真实 IP

经常搭建网站服务器的都知道,在给站点使用了 CDN 后 Web 应用的日志记录里就会只记录 CDN 节点 IP 了,这就没法看到真实客户请求 IP,对于日志分析、运维日常维护来说就有点儿麻烦了,今天明月结合在五洛云服务器上搭建的Apache环境给大家分享一下让日志记录客户真实 IP,毕竟网上的教程很多都是 Nginx 的并且还没法通用。

五洛云服务器的站点使用 CDN 后 Apache 的日志记录客户真实 IP

有关 Nginx 相关的大家可以参考往期文章【使用上海云盾 CDN 和 CloudFlare 后 Nginx、 WordPress、 Typecho 获取访客真实 IP 方法】一文,Apache下还是跟 Nginx 小有区别的。因为从 Apache 2.4 版开始自带了mod_remoteip 模块,就算你用的是宝塔面板,默认安装也都是 2.4.X 版本了,所以本文几乎不限制你的生产环境。

五洛云服务器的站点使用 CDN 后 Apache 的日志记录客户真实 IP

宝塔面板默认安装 Apache 的版本截图

我们要做的就是确认当前的 Apache 是否已经启用了mod_remoteip模块,一般只需要查看 Apache 默认主配置文件http.conf里是否有如下这个模块的加载语句即可:

LoadModule remoteip_module modules/mod_remoteip.so

宝塔面板里 Apache 的主配置文件位置在/www/server/apache/conf/http.conf,大家直接在文件里找到这个文件双击编辑查看就是了。如果已经载入这个模块就进行下一步,否则就要修改为加载这个模块(去掉注释),然后重启一下 Apache 即可。

然后,我们还要在 Apache 扩展配置目录(/www/server/apache/conf/extra/)里修改mod_remoteip.conf文件内容使用 RemoteIPProxiesHeader 从指定字段获取信任 CDN IP(一般 CDN 都会支持的),这样不用设置指定代理 IP(CDN 节点 IP),如下:

RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By

最后再在http.conf文件结尾引用这个mod_remoteip.conf文件,如下:

Include /www/server/apache/conf/extra/mod_remoteip.conf

再继续修改http.conf文件里记录日志格式,使之记录访客 IP,搜索下面两行内容:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

将里面的 %h 改为 %a(完整格式选项可查看此文档),修改后的内容如下:

LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common

保存退出,重启 Apache 后,再去看网站日志是不是访客真实 IP 就有了,不再是 CDN 的节点 IP 了都。

五洛云服务器的站点使用 CDN 后 Apache 的日志记录客户真实 IP

如果你使用的 CDN 不是融合 CDN,而是独立 CDN 的话,如:CloudFlare,这类 CDN 服务商都会给你提供详细准确的 CDN 节点 IP 的,从安全角度来说这种 CDN 才是真正安全、靠谱、实力雄厚的 CDN,我们可以直接修改mod_remoteip.conf文件加上 CDN 节点 IP 地址段(多个以英文空格隔开),如下:

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22

如此修改后保存,重启 Apache 就可以了,此法仅限非融合 CDN 哦,也就是给你提供 CDN 节点 IP 的时候再用就是了。

最后明月提醒大家开启网站日志是个很好的运维习惯,一旦出现任何问题都可以借助日志找到根源和解决应对办法的,关闭日志记录就算是运维高手也没办法给你快速解决问题,基本都是盲猜了!放心,开启日志占用不了多少存储空间的,再说还可以定时自动的切割日志呢!

<think>嗯,用户问的是HTTP_ALI_CDN_REAL_IP,我需要先确定这个术语的具体含义。首先,CDN通常会在请求头中添加一些信息来传递客户端真实IP,比如阿里云的CDN可能会有这样的头字段。HTTP_ALI_CDN_REAL_IP可能是一个自定义的头部,或者是用户项目中使用的特定变量名。 接下来,我应该解释当使用CDN时,服务器的原始IP会被CDNIP取代,因此需要从请求头中获取真实IP。常见的头部有X-Forwarded-For或者X-Real-IP,但不同的CDN服务商可能有不同的命名,比如阿里云可能使用类似的字段。 然后,需要说明如何在服务器配置中处理这些头部,例如Nginx中的配置示例,使用real_ip_header来指定头部,并设置可信的CDN IP段。还要提醒用户注意安全性,确保只有可信的CDN服务器才能传递这些头部,防止伪造。 可能用户是开发人员或者运维人员,遇到获取真实IP的问题,特别是在使用阿里云CDN的情况下。他们可能需要具体的配置步骤和注意事项,所以提供实际的例子会更有帮助。此外,需要确认不同CDN服务商的头部可能不同,建议查阅阿里云的官方文档确认正确的头部名称。</think>`HTTP_ALI_CDN_REAL_IP` 通常与通过阿里云 CDN(内容分发网络)获取客户端真实 IP 地址的需求相关。当网站或服务使用 CDN 时,用户请求会先经过 CDN 节点,导致服务器日志中记录的 IP 地址变为 CDN 节点的 IP,而非用户的真实 IP。为了解决这一问题,CDN 服务商(如阿里云)会在 HTTP 请求头中添加特定字段来传递用户的真实 IP。 --- ### **HTTP_ALI_CDN_REAL_IP 的作用** 1. **传递真实 IP** CDN 节点会将用户的原始 IP 写入一个自定义的 HTTP 请求头(例如 `X-Forwarded-For`、`Ali-CDN-Real-IP` 或 `HTTP_ALI_CDN_REAL_IP`),后端服务器可通过读取该字段获取用户真实 IP。 2. **典型场景** - Web 服务器(如 Nginx、Apache)需要记录用户真实 IP。 - 应用需要根据用户 IP 进行地理位置分析、反爬虫或访问控制。 --- ### **如何获取真实 IP?** #### 1. **查看阿里云 CDN 的头部字段** 阿里云 CDN 默认可能使用以下字段传递真实 IP(具体名称以阿里云文档为准): - `X-Forwarded-For`:通用字段,通常包含客户端 IP 和中间代理 IP。 - `X-Real-IP`:某些配置下会直接存储客户端真实 IP。 - 自定义字段如 `Ali-CDN-Real-IP`(名称可能因版本或配置不同而变化)。 **建议查阅阿里云官方文档**确认当前使用的字段名称。 #### 2. **服务器配置示例(Nginx)** 在 Nginx 中可通过以下配置获取真实 IP: ```nginx server { # 设置从 X-Forwarded-For 中提取真实 IP set_real_ip_from 0.0.0.0/0; # 允许所有 CDN IP(需根据实际 CDN IP 段配置) real_ip_header X-Forwarded-For; real_ip_recursive on; # 日志中记录真实 IP log_format main '$remote_addr - $http_x_forwarded_for'; } ``` - `set_real_ip_from` 需配置为阿里云 CDNIP 地址段(需查询最新列表)。 - 若阿里云使用其他字段(如 `HTTP_ALI_CDN_REAL_IP`),需修改 `real_ip_header`。 #### 3. **应用程序获取方式** 在代码中直接读取 HTTP 请求头: - **PHP 示例**: ```php $real_ip = $_SERVER['HTTP_ALI_CDN_REAL_IP'] ?? $_SERVER['REMOTE_ADDR']; ``` - **Node.js 示例**: ```javascript const realIp = req.headers['ali-cdn-real-ip'] || req.socket.remoteAddress; ``` --- ### **注意事项** 1. **安全性** 需确保只有可信的 CDN 节点 IP 可以传递 `X-Forwarded-For` 等头部,避免伪造 IP 攻击。 2. **兼容性** 不同 CDN 服务商的字段可能不同(例如腾讯云使用 `X-Client-IP`),需根据阿里云文档调整。 3. **验证配置** 可通过在线工具(如 `curl` 或浏览器插件)发送请求,检查服务器是否能正确接收并解析头部。 如果需要更具体的配置步骤,建议参考阿里云 CDN 的官方文档或联系技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月登楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值