Nginx 日志获取不到远程访问ip问题解决

公司有一个应用,后端Web用的是Nginx,Nginx 的所有请求都是通过前端的代理转发过来的,所有在日志格式里面 获取远程ip的变量用的是

$http_x_forwarded_for ,本来用的好好的,但是有一天日志分析脚本里面出现很多请求的 ip地址是空的,大概格式如下

- - - [20/May/2014:02:23:44 -0700] "GET /favi.ico HTTP/1.1" 404 56 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Geo/20100101 Firefox/4.0" - __cust=000000004A5BB94DD441F61302282103 - - 0.002

- - - [20/May/2014:06:18:28-0700] "GET /favi.ico HTTP/1.1" 404 56 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gec/20100101 Firefox/4.0" - __cust=000000004A5BB94DD441F61302282103 - - 0.001

- - - [20/May/2014:06:18:28-0700] "GET /favi.ico HTTP/1.1" 404 56 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gec/20100101 Firefox/4.0" - __cust=000000004A5BB94DD441F61302282103 - - 0.001

很讨厌,为什么会出现这种访问ip为空的现象呢,后来经过分析问题应该出在 $http_x_forwarded_for 这个变量上,因为这个变量获取ip的途径是代理服务器,如果有一些请求没有经过代理服务器而是直接绑定

服务器的host来访问这台服务器的话 $http_x_forwarded_for 根本无法获取到真实的ip地址,所以日志ip地址那里就变成了 “-” ,后来我们用 $remote_addr 就可以得到这个绑定服务器ip 来访问服务器的家伙的ip了。

不过通过代理 访问过来的ip 就获取不到了。怎么办呢?办法来了,写一个if判断,格式如下:

set $remote_addrx $http_x_forwarded_for;

if ( $remote_addrx ~ "" ) {

set $remote_addrx $remote_addr;

}

然后在log_format 里面用新定义的$remote_addrx 变量来代替$http_x_forwarded_for就可以了,呵呵

希望这篇文章对朋友们有用 (*^__^*)

--------------------------------------------------------------------

后来我发现有些情况下 上面的方法也得不到ip ,搜索中看到如下的几种情况的说明

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP

HTTP_VIA = 没数值或不显示

HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP

HTTP_VIA = 没数值或不显示

HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

--------------------------------------------------------------------

如果碰上了上面那些情况,就乖乖的到服务器上去抓包吧~~~

--------------------------------------分割线 --------------------------------------

CentOS 6.2实战部署Nginx+MySQL+PHP

使用Nginx搭建WEB服务器

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程

CentOS 6.3下Nginx性能调优

CentOS 6.3下配置Nginx加载ngx_pagespeed模块

CentOS 6.4安装配置Nginx+Pcre+php-fpm

Nginx安装配置使用详细笔记

Nginx日志过滤 使用ngx_log_if不记录特定日志

--------------------------------------分割线 --------------------------------------

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d8c40f855fec3282d5b212cb6fd285cf.html