Nginx获取CDN加速前的真实用户IP地址

Nginx IT敢客 7个月前 (04-08) 8701次浏览 已收录 0个评论 扫描二维码

        前两天写了一个 Apache 获取 CDN 加速前的真实用户 IP 地址的文章,现在写另一个重要 Web 代理工具 Nginx 实现同样功能的配置方法。
        现在而言,绝大多数网站都使用了复杂的 web 结构,比如下面这种,普通用户浏览器  ——>   360 网站卫士加速(CDN,360 防 CC,DOS 攻击) ——>  百度云加速服务器——> 阿里云盾 ——>  源服务器(PHP 程序部署在这里,iptables, nginx 安全配置),这种比较复杂的结构,我们最后在服务器上查看 access 日志的时候是没有用户真实 ip 地址的,这样或导致我们无法做到许多黑名单限制,当然可以在云盾或者 CDN 加速上做 ip 黑名单,总归而言,还不是万无一失!
        当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入 一个记录 X-Forwarded-For :  用户 IP, 代理服务器 IP,如果中间经历了不止一个 代理服务器,而是中间建立多层代理之后,这个 记录会是这样 X-Forwarded-For :  用户 IP, 代理服务器 1-IP, 代理服务器 2-IP, 代理服务器 3-IP, ….可以看到经过好多层代理之后, 用户的真实 IP 在第一个位置, 后面会跟一串 中间代理服务器的 IP 地址,我们需要的用户真实 IP 是第一个 IP 地址。
        在 nginx 日志中如果需要打印用户真实 ip 地址,需要在配置文件中做如下设置

log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" ';
access_log /usr/local/nginx/logs/access.log main;

或者换成 access 也行。

log_format  access  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" ';
access_log /usr/local/nginx/logs/access.log access;

这时候一定要重启 nginx,而不是 reload。切记切记~~~
Nginx 获取 CDN 加速前的真实用户 IP 地址


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Nginx 获取 CDN 加速前的真实用户 IP 地址
喜欢 (155)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址