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

tengxunyun cera

获取和记录站点访客的真实 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 并赋值到一个变量:

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

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

  1. #日志中记录真实 IP 地址,替换$remote_addr 为上面的$clientRealIP.
  2. log_format  main  ‘$clientRealIP – $remote_user [$time_local“$request” ‘
  3.                              ‘$status $body_bytes_sent $brotli_ratio “$http_referer” ‘
  4.                             ‘“$http_user_agent”‘;

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

  1. 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 采取了相应的防御策略,总之效果还是非常不错的,使用本地日志分析软件的时候统计结果也更加的精准了许多

cera aliyun tengxunyun cloudiplc

相关推荐

centos7.3安装nginx默认IP地址无法访问

今天在纯净版本centos上面安装nginx,输入命令:find -name nginx 发现安装目录存在 输入ps -ef | grep nginx 发现进程也存在,按照网上的方法卸载firewall防火墙 安装iptables防火墙,还是没用,我以为是nginx没监听80端口,去nginx.conf查看,已监听模式,纳闷,最后发现是缺少配置文件,具体请看下方吧,难受香菇 centos7查看防火墙状态 firewall-cmd –state centos7关闭防火墙 systemctl stop firewalld.service centos开启防火墙 systemctl start firewalld.service centos禁止防火墙开机启动 systemctl disable firewalld.service yum install wget #安装下载工具 wget http://www.atomicorp.com/installers/atomic #下载 sh ./atomic #安装 yum check-update #更新yum源 有的需要更新几次 才有nginx最新版本 否则是老版本nginx yum remove httpd* php* #删除系统自带的软件包 也可加mysql*前提备份数据库 yum install nginx #安装nginx根据提示输入y进行安装 chkconfig nginx on …

宝塔通过NGINX反向代理 缓存文件搭建镜像站

location / { proxy_ssl_server_name on; expires 3d; proxy_set_header Accept-Encoding ”; root /www/wwwroot/【域名】; proxy_store on; proxy_store_access user:rw group:rw all:rw; proxy_temp_path /www/wwwroot/【域名】; if ( !-e $request_filename) { proxy_pass https://raw.githubusercontent.com; } } 可以通过上述代码在宝塔创建#反向代理#后,通过修改配置文件搭建镜像站,用来搭建#github#下载#镜像#比较方便,同时文件会在网站目录下保存,可以反向代理https网站

AppNode|Linux下|可视化WEB管理面板|可一键安装Nginx|PHP|Mysql等

挺不错的免费#可视化##WEB#管理面板,比较良心,#免费版#和收费版功能一样,唯一的区别是免费版仅可建3个站点,不过一般足够了,另外,收费版也很便宜。免费的插件,相比宝塔面板,良心很多。 仅支持CentOS 6.x 32/64位 、 CentOS 7.x 64位。 一键安装Nginx、PHP7.2、Mysql5.6、PureFTPd: INSTALL_AGENT=1 INSTALL_APPS=sitemgr INSTALL_PKGS=’nginx-stable,php72,pureftpd,mysql56′ bash -c “$(curl -sS http://dl.appnode.com/install.sh)” 自定义安装页面:https://www.appnode.com/install 同时,面板安装好后,后台可安装模块,有#rsync#同步、#frp#内网穿透、端口映射、流量统计、备份管理等等。 官网:https://www.appnode.com/  

Nginx Rewrite规则隐藏.php后缀

Nginx中的$uri变量表示域名后面的URL部分,可以通过try_files指令+ $uri变量来实现Nninx Rewrite规则隐藏.php后缀,该方法取自WordPress的Nginx伪静态规则。 规则代码 将以下代码放进域名配置文件的server区域中即可: location / { try_files $uri $uri/ /index.php?$args; } 这样即可实现通过example.com/example的地址格式来访问example.com/example.php 参考链接 http://nginx.org/en/docs/http/ngx_http_core_module.html#var_uri https://www.nginx.com/blog/creating-nginx-rewrite-rules/

微信扫一扫,分享到朋友圈

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