环境:
nginx做反向代理 后端apache 。
apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。
这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。
(一)手动安装apache (nginx-----》apache---》tomcat)
nginx:
/usr/nginx/conf/nginx.conf 添加以下参数:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
同时修改:
server {
listen 80;
server_name 域名 ;
proxy_redirect off;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header Host $host;
proxy_pass http://域名;
}
access_log off;
}
重启nginx
apache:
安装apache的一个第三方模块"mod_rpaf"了, 官方网站: http://stderr.net/apache/rpaf/
wget 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
/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
修改apache配置 /usr/apache2/conf/httpd.conf
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips ip地址 #Nginx所在服务器的IP
RPAFheader X-Forwarded-For
重启apache 查看日志就可以看见日志中已经获得到真实ip了。
================================================================
(二)apt-get安装的apache (nginx----》apache----》tomcat)
如果是apt-get install apache2 安装的apache 那么nginx配置如上不变,apache2配置如下:
使用apt-get install apache2安装的apache默认是不带apxs的,但这里安装的mod需要apxs,可以通过安装apache2-dev实现。
命令如下:
root@debian:~# apt-get install apache2-dev
安装完后查看安装的路径:
root@debian:~# whereis apxs2
apxs2: /usr/bin/apxs2 /usr/share/man/man8/apxs2.8.gz
root@debian:~#
如果make过程出现这样到错误:fatal error: Python.h: No such file or directory 可以安装python2.6-dev解决
root@debian:~# apt-get install python2.6-dev
3.2 安装rpaf
到http://stderr.net/apache/rpaf/download/ 下载最新软件包
tips:查看下载的软件包README文件,你会发现非常有用。
root@debian:~# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
root@debian:~# tar xvf mod_rpaf-0.6.tar.gz
root@debian:~# cd mod_rpaf-0.6
root@debian:~# /usr/bin/apxs2 -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
或者直接使用make命令安装
此模块会被自动安装到/usr/lib/apache2/modules里面,具体文件是mod_rpaf-2.0.so
下面最重要:
root@debian:~# cd /etc/apache2/mods-available
root@debian:~# touch rpaf.load rpaf.conf
root@debian:~# vim rpaf.load
添加如下内容:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so
root@debian:~# vim rpaf.conf
添加如下内容:
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.1.8 # 填写Nginx所在的前端的来访IP,有几个写几个
此时即可使用Ubuntu apache2中的a2enmod命令启用或禁用模块
root@debian:~# a2enmod rpaf
root@debian:~# /etc/init.d/apache2 restart
=================================================================
(三)后端无apache (nginx----》tomcat)
使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP。要解决这个问题可以在Nginx配置一个新的Header,用来存储$remote_add,然后再Tomcat获取记录这个值。
1.Nginx新增配置:
proxy_set_header X-Real-IP $remote_addr;
可以参见:http://wiki.nginx.org/NginxHttpProxyModule
其实就是新增了一个名为X-Real-IP值为真实客户端IP的头信息。
2.修改tomcat日志配置:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="tomcat_access_log." suffix=".txt"
pattern="%a %r %t %{X-Real_IP}i" resolveHosts="false"/>
没有Nginx这一层的时候直接用%a就可以获得客户端IP,现在我们得用%{X-Real-IP}i 来获得真实的IP了。