apache转发客户端端口到tomcat的配置 以及 apache日志格式的配置

原创 2015年05月22日 14:06:10

一、apache转发客户端端口到tomcat的配置

做项目的时候需要获取客户端的ip以及端口。试了三种方式(下面贴了具体代码)都没办法去的客户端的端口,只能一步一步查原因了。我用第一第二种获取端口的方式拿到的都是null,第三种方式我拿到的客户端端口是0或者-1。登到公司服务器上,发现请求首先会到apache上,然后通过ajp协议转到tomcat。apache同时完成了反向代理。实现了在同一个域名下,apache会根据请求的地址,自动分配的各自的tomcat上。

这样看来很可能是apache转发的时候把客户的源端口丢失了。apache作为代理服务器,可以通过配置mod_rewrite 和 mod_headers这两个模块实现。

第一步,在apache配置文件中追加对上面两个module的引用,apache的配置文件httpd.conf:

LoadModule rewrite_module                 modules/mod_rewrite.so  
LoadModule headers_module                 modules/mod_headers.so 
(其实我自己这边服务器上的配置文件这里只是被注释掉了,去掉#就好了)

第二步,在apache配置文件中加上具体的rewrite规则

RewriteEngine on  
RewriteRule .* - [E=REMOTE_PORT:%{REMOTE_PORT},NE]  
RequestHeader set X-Forwarded-SourcePort %{REMOTE_PORT}e
第一行是开启的意思

第二行是设置规则

第三行是添加属性

第三步,在每一个<VirtualHost>段里面加上这两行

RewriteEngine On   
RewriteOptions Inherit 

到第二步为止其实已经完成了转发端口用户的源端口,但是在我找资料的时候看见如果在apache上使用了虚拟主机,那还需要做第三步的操作,我这里一起整理了。


既然整理了,那我也顺便把我取源ip和端口的代码贴上来吧!

获取客户端源ip:

    //获取用户真实IP地址
    public String getUserIp(HttpServletRequest request){
        String[] sList = null;
        String sIp = null;
        sIp = request.getHeader("x-forwarded-for");
        
        if(sIp == null || sIp.length() == 0 || "unknown".equalsIgnoreCase(sIp)){
            sIp = request.getHeader("Proxy-Client-IP");
        }else{
        	//如果通过了多级反向代理的话,取X-Forwarded-For中第一个非unknown的有效IP字符串
            sList = sIp.split(","); 
            for(int i =0;i<sList.length;i++){
                if(sList[i]!= null && !"unknown".equalsIgnoreCase(sList[i])){
                    sIp = sList[i];
                    break;
                }
            
            }
        }
        
        if(sIp == null || sIp.length() == 0 || "unknown".equalsIgnoreCase(sIp)){
            sIp = request.getHeader("WL-Proxy-Client-IP");
        }
        if(sIp == null || sIp.length() == 0 || "unknown".equalsIgnoreCase(sIp)){
            sIp = request.getRemoteAddr();
        }
        
        return sIp;
    }

获取客户端源端口:

//获取用户端口
    public String getUserPort(HttpServletRequest request){
    	String sPort = null;
    	//第一种
//    	sPort = request.getHeader("remote_port");
    	
    	//第二种
    	sPort = request.getHeader("X-Forwarded-SourcePort");
    	
    	//第三种
//    	int port = request.getRemotePort();
//    	sPort = String.valueOf(port);
    	
    	return sPort;
    }


其实走通这一步非常坎坷,开始我用了第一第二种方式获取端口的,但是都是null,后来用了第三种方式,获取到的客户端端口是0或者-1。那说明了这种方式是可行的,但是由于apache通过ajp协议的转发导致tomcat没拿到。所以,我的解决办法是现将ajp协议换成httpd协议,然后再修改apache配置(步骤一二三)。

后来在测试的时候跟项目日志和apache日志,我发现先直接请求tomcat得到的端口与通过apache转发获取的端口,两者我发现用差了很大。所以我又调整为第二种,其实是可以取到的,估计开始的时候我配置的不完整导致取不到这个属性。所以,最终我是通过获取apache配置的属性得到了客户端的源端口。

二、apache日志格式的配置

接下来介绍一下怎么在apache的日志信息里面加上客户端源ip和源端口。

apache日志信息的配置还是在httpd.conf文件里面。有两个基本指令,一个是日志路径CustomLog,还有一个是日志格式LogFormat

1、CustomLog日志路径

规则:CustomLog file|pipe format|nickname [env=[!]environment-variable]

1)file|pipe是符号“|”后面跟日志处理程序的路径(就像这样:| 日志处理程序路径)

2)format|nickname 日志的保存路径和命名规则 

3)[env=[!]environment-variable],即[env=[!]服务器环境变量],它根据服务器上特定的环境变量是否被设置来决定是否对某一特定的请求进行日志记录。如果这个特定的环境变量被设置(或者在”env=!name”的情况下未被设置),那么这个请求将被记录

我的配置是这样的:

CustomLog "|/opt/apache2.2/bin/rotatelogs /opt/apache2.2/logs/access_%Y_%m_%d_log 86400" common

2、LogFormat日志格式

规则:LogFormat “格式串” 日志格式名称

我需要在日志信息里面加上客户的源ip和端口,所以配置如下:

LogFormat "%h %{REMOTE_PORT}e %l %u %t \"%r\" %>s %b" common

这里的%{REMOTE_PORT}e代表远端端口。他的原始格式是%{FOOBAR}e ,FOOBAR是环境变量的值而环境器环境变量在mod_rewrite模块定义了下面表格里的属性

HTTP头 连接与请求  
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
 
服务器自身 日期和时间 其它
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
apache的配置文件修改完以后要重启以后才会生效!!去日志目录下看日志,如果打印出来的是-,那就仔细检查吧,肯定少配了什么~~~
附上apache手册,以便参考!!点击打开链接

玩转apache之日志【转帖】

本文原出处 http://www.zhangyiqun.cn/26.html 原作者 作者:张逸群 Mail:jeantoe@gmail.com   引言 要有效地管理W...
  • jiary5201314
  • jiary5201314
  • 2015年11月03日 10:57
  • 3745

Apache日志配置远程Syslog采集

本文将指引你:如何对Apache日志进行采集,并通过Syslog协议,自动实时的发送到远程的集中日志分析中心,便于集中式的日志存储和管理,提高网站的运维效率。 第一步:初始化日志采集环境 先确保系...
  • leizi191110211
  • leizi191110211
  • 2016年06月06日 10:27
  • 1878

Apache+tomcat的整合

为什么要做这个整合呢?当然,首先想到是就是Apache和Tomcat的区别。正因为有区别,有各自的优缺点才需要整合,取二者所长,弃二者所短。 Apache和Tomcat都可以在他们的官网下载: ht...
  • StefYue
  • StefYue
  • 2011年10月30日 22:33
  • 35170

如何整合Apache和Tomcat部署Web应用

原文地址:http://blog.csdn.net/gengv/article/details/5739438 从网上查了不少资料,想了解一下如何整合Apache和Tomcat,以便让Apa...
  • johnstrive
  • johnstrive
  • 2014年12月18日 22:54
  • 18272

Apache+Tomcat配置转发

Apache+Tomcat结合处理,能够使得两者相互补助
  • wanghjbuf
  • wanghjbuf
  • 2016年12月17日 01:08
  • 622

apache多域名转发至tomcat&https设置&虚拟主机的设置

最近忙于工作中的apache+tomcat的多域名转发,一个看起来非常简单的工作,实际做起来并没有想象中那么容易。为了将来的工作方便,必须先记录下来。整个流程分成以下几个要点1.apache如何转发多...
  • Stewart
  • Stewart
  • 2011年04月20日 16:18
  • 8778

Windows集成服务器环境Apache+Tomcat+Php+Jsp+MySQL

                              配置集成服务器环境Apache+Tomcat+Php+Jsp+MySQL   说明:Apache版本和Tomcat & Php &...
  • z507263441
  • z507263441
  • 2014年10月23日 17:32
  • 16587

apache+tomcat整合以及域名绑定

准备任务: 1、下载jdk 2、下载apache2.0.55 3、下载tomcat5.5 4、下载jk(mod_jk-apache-2.0.55.so)中间件,连接apache...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2013年01月31日 10:08
  • 5824

Apache 实现ProxyPass转发URL到Tomcat并实现http自动转https

1 实现原理与工作流程 原理: 客户浏览器使用https协议访问 ApacheServer 。ApacheServer将请求转发到后端的Tomcat。ApacheServer与后端的Tom...
  • Heng_Ji
  • Heng_Ji
  • 2017年04月07日 15:48
  • 3306

apache与 tomcat 搭建https及其关系

Apache的Http Server与Tomcat6进行了整合的实验。 这样的架构的好处在于: ü   减轻App Server端的压力,用Web Server来分压,即Web Serve...
  • hunhun1122
  • hunhun1122
  • 2016年10月13日 15:11
  • 2841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:apache转发客户端端口到tomcat的配置 以及 apache日志格式的配置
举报原因:
原因补充:

(最多只允许输入30个字)