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

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

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

宝塔面板默认安装 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 不是融合 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 的时候再用就是了。

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

相关推荐
红红谈说35 分钟前
定时发布关机就停,本地定时任务的补跑策略怎么设计?
运维·服务器·定时任务·本地调度·补跑策略·幂等互斥·执行记录
努力变的更好37 分钟前
H5与小程序之间的回调
前端·小程序·apache
2401_868534781 小时前
论纯IPv6(IPv6-Only)演进与地址规划设计与实施
服务器·网络
爱和冰阔落1 小时前
【Linux网络】UDP 服务器怎么写?从 socket、bind 到 recvfrom/sendto,手写完整回显服务器
linux·运维·服务器·网络
知已难寻1 小时前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
小白的码BUG之路1 小时前
K8S -- 集群搭建环境基础
java·服务器·kubernetes
开开心心就好2 小时前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
波力海苔夹心脆6752 小时前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
香蕉大香蕉(06敬畏市场)2 小时前
高频八股 · JVM(7):方法区、元空间与字符串常量池
java·jvm·ai·博客·八股·大厂实习
山东孙燕姿3 小时前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架