Nginx 不受 CDN 服务影响获取访客真实 IP

关注一下,更多精彩等着你!

获取和记录站点访客的真实 IP 对于站点日志的分析和安全策略的指定很有帮助,Nginx 默认的日志记录获取到的 IP 地址如果站点启用了 CDN 服务,那么这里的 IP 地址都是 CDN 服务器节点的 IP 地址了,并不是用户访客的 IP 地址(如图 1),这时候分析 Nginx 日志看到的数据就不是很真实了,影响判断呀!今天明月就给大家分享一个 Nginx 不受 CDN 服务影响获取访客真实 IP 的方法。

这个方法是完全基于 Nginx 的,主要表现在 Nginx 的日志记录里的,WordPress、Typecho 博客平台下获取访客真实 IP 可以参考『总是忘了 CDN 后评论用户的真实 IP 地址获取问题』一文的方法,这段代码是通用的好像,只要是 PHP 就可以使用的。

图 1

从图 1 里可以看到 Nginx 日志里记录的183.131.214.25、59.56.78.45 等等这些 IP 地址基本上都是 CDN 服务的节点 IP,这样的统计结果很明显混乱不堪毫无分析价值了都。好在明月以前折腾“Nginx 限制单个 IP 的并发连接数/速度”的时候知道通过 map 指令绕过 CDN 获取访客真实 IP(可参考哦『Nginx 限制单个 IP 的并发连接数改进适配开启 CDN 站点』一文),由此让 Nginx 日志记录访客真实 IP 不受 CDN 服务影响的方法也就出来了,只需要在你的 Nginx 的配置文件 nginx.conf 里添加如下配置代码获取访客真实 IP 并赋值到一个变量:

#获取用户真实 IP,并赋值给变量$clientRealIP map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; }

然后在指定 Nginx 日志格式的 log_format 里替换$remote_addr 为上面的$clientRealIP 的变量即可,修改后如下:

#日志中记录真实 IP 地址,替换$remote_addr 为上面的$clientRealIP. log_format main '$clientRealIP - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent $brotli_ratio "$http_referer" ' '"$http_user_agent"';

最后为了让这个 Nginx 日志格式配置生效,在站点日志配置文件里采用这个日志格式生成日志即可,配置代码如下:

access_log /home/wwwlogs/www.xxxxxxxx.com.log main;

注意 access_log 这段最后的 main 哦,这里要跟上面的日志格式对应的才能生效哦,记得要修改 XXXXX 为你的站点域名或者站点日志文件名称哦。

重启一下 Nginx 生效配置,这时候查看 Nginx 日志文件是不是访客 IP 都是真实 IP 了,不再是 CDN 节点 IP 了。要验证日志实时输出才可以看到确切效果,如下截图:

可以看到,日志记录的访客 IP 已经都是访客 IP 了,不再是千篇一律的 CDN 节点 IP 了,大功告成!以后分析日志原始数据就准确了,再也不会发生屏蔽某个 IP 后造成误伤 CDN 节点的事儿了,同时对于那些恶意扫描、注入的请求的 IP 也可以有的放矢来应对了。

这个方法最大的优点就是几乎不会增加任何性能负载,也不依赖任何第三方模块,完全是采用 Nginx 内置命令来解决的,明月已经用这个方法多次获取到恶意请求、恶意注入、恶意攻击者的真实 IP 采取了相应的防御策略,总之效果还是非常不错的,使用本地日志分析软件的时候统计结果也更加的精准了许多(可参考『站长必备的网站日志分析工具:360 星图』一文)。

·END·

本文分享自微信公众号 - 草根博客站长有话说(imydl-blog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维经验分享

Centos Monit 使用教程 原

4.这样最简单的一个nginx进程监控就完成了,可以通过 www.example.com:2812 在网页上查看了

14130
来自专栏后端技术探索

Nginx 通过 Lua + Redis 实现动态封禁 IP

为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ,拒绝提供服务。

16820
来自专栏原创分享

nginx0.1.0 access_handler模块源码分析

access模块主要是对连接到nginx中的客户端进行权限管理,nginx会根据access模块注册的命令,在解析命令的时候,遇到对应的命令的时候,会调用acc...

9660
来自专栏Web技术布道师

实现单机百万并发

从客户端角度看,单机如果能发出百万并发,那我可以做出一个能发出百万并发的压测工具。从服务端角度看,可以优化现有的服务器支持更多的并发。

24520
来自专栏后端技术探索

Nginx和F5区别

Nginx:高性能的 HTTP和反向代理服务器,同时支持作为IMAP/POP3/SMTP代理服务器。目前被很多网站应用为其HTTP软负载均衡器。高效的性能、良好...

14240
来自专栏Web技术布道师

docker搭建php+nginx+swoole+mysql+redis环境

软件:docker-ce version 18.09.3, docker-compose version 1.23.2

34120
来自专栏运维经验分享

[喵咪Liunx(4)Monit进程监控 原

有一段时间没有更新博客了,最近因为公司项目全球化以及最近慢慢在偏向学习团队管理忙的有点不可开交了,不过这次要给大家带来两篇关于Liunx日常开发维护管理中非常好...

9120
来自专栏后端技术探索

F5收购NGINX

11 日,F5 与 NGINX 宣布了一项最终协议,根据该协议,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。

12440
来自专栏Python研发

Nginx配置https, 80端口重定向443

78430
来自专栏后端技术探索

nginx的延迟关闭

最近业务方反馈线上 Nginx 经常会打出一些『奇怪』的 access 日志,奇怪之处在于这些日志的 request_time 值总是正好 upstream_r...

32620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励