Author: admin | Category: Apache, Nginx
Comments: 评论关闭

Apache 有个第三方开发的 mod_rpaf ,用于当 Apache 置于 proxy 后端的时候接收到前端送来的 IP head
从而获取到真实的IP. 不然日志跟应用都始终只能获取到 反向代理服务端的IP

详细请看:http://www.oschina.net/discuss/thread/675

简单说就是,Nginx –> Apache 能获取到用户访问的真实IP .

但如果反过来,又或者是 Squid –> Nginx 呢?

有这么一情况,某网站静态文件很多,而且用户访问的来源有网通,有电信,有铁通…设置还有国外。
为了令处于不同网络运营商的用户收取静态文件的速度都有良好的体现,该网站分别在这些不同运营商的积分中部署了Squid,然后统一 Proxy 到主站的 Nginx 上,形成分布式缓存架构。

如果单是这样的话,主站上 Nginx 的日志,或者应用所获得的IP来源,始终都只会是各个机房中 Squid 的IP。而不是用户的真实IP。Apache 的话,能通过以上所提到的mod_rpaf解决。当然,强大的 Nginx 也有自己的看家法宝。

Nginx 有个在编译时默认不加载的模块 http_realip_module ,就是用来实现这一功能。
但网上很多作者对这一模块的理解完全错误,以为是 Proxy 参数里头的 proxy_set_header 。

proxy_set_header 用于向后端转发 IP head,这一参数是位于 proxy_module  模块中的,而并非 http_realip_module .
好多的博主写文章的时候,都把这模块的用途写成了“为后端应用提供 realip ”

Nginx 官方 wiki 对于该模块的说明 http://wiki.nginx.org/NginxHttpRealIpModule

“It is useful if nginx works behind some proxy of L7 load balanver, and request come from local IP, but proxy add request header with client’s IP.

This module isn’t built by default, enable it with the configure option ”

说简单了,就是 Nginx 的 http_realip_module = Apache 的 mod_rpaf 用于接受前端发来的 IP head 信息,从获取到真是的用户IP。

配置方式相当简单,重新编译 Nginx 加上 –with-http_realip_module 参数,如:

./configure –prefix=/opt/nginx –with-http_stub_status_module  –with-pcre=../pcre-6.6 –with-http_realip_module
make
make install

怎么?Nginx 的服务正在跑着?要重启不容易?
简单,原来你的 Nginx 装在哪,重新编译的时候就选哪,直接 make install 进去就会把原来的覆盖掉。

然后执行 Killall -s USR2 nginx 即可平滑升级。
编辑 Nginx.conf

在 location 里头插入

set_real_ip_from   192.168.1.0/24;     指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
set_real_ip_from   192.168.2.1;  
real_ip_header     X-Real-IP;         IP head  的对应参数,默认即可。

配置跟 mod_rpaf  大致相同!

配置完成后 sbin/nginx -t 测试语法
测试无误执行 Killall -s HUP nginx 平滑加载配置。

这么就无间断完成了Nginx这一模块的加载。

Author: admin | Category: Apache, Nginx
Comments: 评论关闭

自从Nginx出现以后,我们都喜欢让 Nginx 跑在前方处理静态文件,然后通过 proxy 把动态请求过滤给 apache。

这么有个问题,跑在后方 apache 上的应用获取到的IP都是Nginx所在服务器的IP ,或者是本机 127.0.0.1 。
最明显就是查看 apache 的访问日志。就会见到来来去去都是内网的IP。

如果你的应用有诸如,“单个IP不能重复登陆”,“单个IP注册相隔n分钟”… 之类用于IP判别的安全规则。
这么就麻烦了….

但还好,你可以通过修改 nginx proxy 的参数令后端应用获取到 Nginx 发来的请求报文获取到外网的IP。

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

但这解决的问题单单只是应用上,apache 日志上所获取的ip依然还是本地。

特别有些考虑不周全的应用,例如 Tattertools (一个博客程序) 就会犯误。
后台的访问日志死活显示访客数 1,ip来自 127.0.0.1

搜寻了一下,发现了apache这一个来自第三方的mod 配合Nginx proxy 使用。

说明:http://stderr.net/apache/rpaf/

下载:http://stderr.net/apache/rpaf/download/

最新版本是 mod_rpaf-0.6.tar.gz  

安装也相当简单。

# tar zxvf mod_rpaf-0.6.tar.gz   下载后解压

# cd mod_rpaf-0.6 

Apache 的目录按自己的环境修改,并选择相应的安装方式:

#/usr/local/apache/bin/apxs -i -a -c mod_rpaf.c    Apache 1.3.x 的安装方式
#/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c   Apache 2.x 的安装方式

完成后会在 http.conf  的 LoadModule 区域 为你多加了一行。

LoadModule mod_rpaf-2.0.so_module modules/mod_rpaf-2.0.so

经 apache 2.2.6 的实验,使用这一行启动 apache 的时候会报错的。

所以改为:
LoadModule rpaf_module        modules/mod_rpaf-2.0.so
并在下方添加

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.10.2    # 填写Nginx所在的内网IP。
RPAFheader X-Forwarded-For

保存退出后重启apache

再看看 apache 的日志内容? 呵,不再是来来去去的那几个IP了吧。

Top
RSS for entries