环境:

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了。