自从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依然还是本地。
搜寻了一下,发现了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了吧。
转载自http://blog.sina.com.cn/s/blog_4560b80b0100m79m.html