该模块在1.4.14及以后的版本才有,主要功能是在使用了反向代理后,可以获取客户端真实IP地址,在使用了nginx或者NetScaler这样的反响代理/负载均衡设备以后,后段服务器的访问日志中看到的请求IP都是前面的nginx或者NetScaler的IP,而我们很多时候需要通过分析Log来查看用户访问的地理分布情况,这就需要记录来访用户的真实IP地址。
1.首先需要在前端的负载均衡设备上配置http头,插入一个"X-Forwarded-For"或者"X-Real-IP"。 在NetScaler上有两种方法可以实现,使用哪种要看具体需求。
如果后端的服务器上有ACL限制,并且是基于源地址的,那么使用USIP模式。 如果后端是http服务器,而且记录客户端IP的目的单纯是为了日志分析,那么推荐Client IP (CIP) insertion模式。
USIP模式配置方法:
打开全局USIP模式支持
enable ns mode USIP
在服务配置的时候,钩选USIP,或用下边命令
set service <serviceName> -usip YES
Client IP (CIP) insertion模式配置方法:
set config -httpPort 80 -cip ENABLE <cipHeader>
set service test -cip ENABLED <cipheader>
2.修改lighttpd的配置文件,载入模块mod_extforward。
# vi /etc/lighttpd/lighttpd.conf
server.modules = (
"mod_redirect",
"mod_alias",
"mod_rewrite",
"mod_expire",
"mod_access",
"mod_auth",
"mod_status",
"mod_fastcgi",
"mod_secdownload",
"mod_accesslog",
"mod_compress",
### add mod_extforward ####
"mod_extforward"
)
将前端的nginx或者NetScaler地址加入到信任列表中:
extforward.forwarder = (
"10.10.28.5" => "trust",
"10.10.28.6" => "trust"
)
设置搜索指定的header,获取真正的用户IP
extforward.headers = ("X-Cluster-Client-Ip")
或者
extforward.headers = ("X-Real-Ip")
重起lighttpd服务
# service lighttpd restart
查看lighttpd的访问日志,应该可以看到记录了真正的用户IP。
# tail -f /var/log/lighttpd/access.log
不过此时使用netstat -na查看,你会发现连接的源地址还是nginx或NetScaler的IP地址。
参考文章: http://www.cyberciti.biz/faq/nginx-extract-the-clients-real-ip-from-x-forwarded-for-header/