Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4250341
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类: 系统运维

2010-12-25 18:14:29

如何让Web服务器透明获得客户端IP
2010年02月22日 星期一 下午 02:27

作者:老王

获得客户端IP原本是一个非常简单的事情,程序里很多时候使用REMOTE_ADDR环境变量就可以了,但随着网络结构复杂性越来越高,比如说 Apache前有Nginx,或者Nginx前有Squid,这时就复杂了,还得考虑诸 如:HTTP_CLIENTADDRESS,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR等环境变量,当然可以通过编写程序 代码来处理此类逻辑,不过这样的解决方法不够透明,毕竟很多第三方程序并没有考虑这些情况,而且后面服务器的日志里面记录的IP全变成了前面服务器的 IP,如此一来,Awstats之类的软件就失效了。下面看看如何透明处理:

案例1:Apache前有Nginx

有些网站使用这样的方式来分离静态请求和动态请求,Nginx放在前面处理静态请求,然后再把动态请求转发给后面的Apache,不过如此一来,Apache日志里看到的IP就是Nginx的IP了,为了能让Apache透明获取IP,可以使用:

配置很简单,只需在配置文件里加上如下内容:

LoadModule rpaf_module libexec/apache2/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.0.1

RPAFheader X-Forwarded-For


说明:192.168.0.1指的是Nginx内网IP,可以设置多个IP。

最后确认一下Nginx配置文件里在把动态请求转发给Apache的时候是否设置了如下内容:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


重新加载一下服务,差不多就OK了。

案例2:Nginx前有Squid

有些网站使用这样的方式来搭建分布式缓存,若干台Squid放在前面提供缓存服务,内容从后面的Nginx获取。不过如此一来,Nginx日志里看到的IP就是Squid的IP了,为了能让Nginx透明获取IP,可以使用。

NginxHttpRealIpModule缺省并没有激活,可以在编译的时候使用--with-http_realip_module选项激活它。

配置很简单,只需在配置文件里加上如下内容:

set_real_ip_from   192.168.1.0/24;
set_real_ip_from   192.168.2.1;
real_ip_header     [X-Real-IP|X-Forwarded-For];


需要说明的地方就是设置IP源的时候可以设置单个IP,也可以设置IP段,另外是使用X-Real-IP还是X-Forwarded-For,取决于前面的服务器有哪个头

重新加载一下服务,差不多就OK了。

另外:Lighttpd有一个类似的模块叫,功能差不多,就不多说了。

http://hi.baidu.com/thinkinginlamp/blog/item/c37ad407e08d25c67b8947b0.html


lsstarboy转注:
set_real_ip_from   192.168.1.0/24;
set_real_ip_from   192.168.2.1;
real_ip_header     [X-Real-IP|X-Forwarded-For];
以上三行直接写在http中就可以了,并且如果有缓存的话,还需要一段时间才能记录正确。
阅读(2932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~