令 Nginx 后端的 Apache 获取到互联网 IP

http://blog.csdn.net/songerzhou/article/details/5142863

自从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了吧。

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

Apache后端获取用户真实IP地址-nginx前端

mod_rpaf 是一个 Apache的模块,利用它可以给 Apache 的后端应用提供客户端真实的IP地址
在nginx作为前端,apache作为后端的情况下,apache只能获取到nginx前端的ip地址,而无法获取到用户的真实ip地址,在这种情况下,如果php需要对用户的ip做限制将无法实现。针对这种环境,apache开发了相应的模块mod_rpaf,能够获取到用户的真实ip地址。

如下图:
nginx代理下-apache获取用户真实ip地址
左边只能获取到nginx代理的IP地址,右边Apache才能获取到用户的真实ip地址
使用方法:
[codesyntax lang="java" lines="no"]
# if DSO load module first:
LoadModule rpaf_module libexec/apache2/mod_rpaf-2.0.so

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1
RPAFheader X-Forwarded-For
[/codesyntax]

具体安装配置请往下看
下载安装模块
[codesyntax lang="java" lines="no"]
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar -xzvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6/
/usr/local/apache2.2.15/bin/apxs  -i -c -n mod_rpaf-2.0.slo mod_rpaf-2.0.c
[/codesyntax]

添加apache配置
[codesyntax lang="java" lines="no"]
vi  /usr/local/apache2.2.15/conf/httpd.conf
# 在最后一行复制如下内容
LoadModule rpaf_module        modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.50.10 # 代理服务器的ip地址(记得做相应修改)
RPAFheader X-Forwarded-For
备注:RPAFproxy_ips后面添加代理服务器的ip地址,有几个填几个
[/codesyntax]

查看apache是否有rapf模块
[codesyntax lang="java" lines="no"]
# /usr/local/apache2.2.15/bin/apachectl -M | grep rpaf
rpaf_module (shared)
[/codesyntax]

最后重启Apache即可
[codesyntax lang="java" lines="no"]
# /usr/local/apache2.2.15/bin/apachectl -t
# /usr/local/apache2.2.15/bin/apachectl restart
[/codesyntax]

猜你喜欢

转载自tdcq.iteye.com/blog/1677581
今日推荐