tomcat的server.xml中配置,httpd.conf也要配置,
server.xml
<Context path="/file" docBase="file"
        debug="0" reloadable="true" crossContext="true" privileged="true">
  <Logger className="org.apache.catalina.logger.FileLogger"
             prefix="localhost_DBTest_log." suffix=".txt"
             timestamp="true"/>
  </Context>httpd.confAlias /file/ "c:/tomcat5/webapps/file/"
    <Directory "c:/tomcat5/webapps/file/">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>使其认识tomcat的这个应用

解决方案 »

  1.   


    Apache整合Tomcat的目的一般是让Apache管静态文件,Tomcat管动态页面。Apache负责转发动态页面的请求。Apache也根本不理睬Tomcat的Context,它只管根据转发请求的匹配规则对uri进行匹配,然后把相应需要转发的请求交给tomcat,只要明白这一点,就应该知道他们是怎么维护的了。如果需要较高的安全性的话,一般建议静态页面和动态页面分开存放。
    尤其是在Tomcat4.x版本有bug的时候,Apache整合之后,用户可以通过输入特殊的url来获取jsp的源代码。
    例如:http://loaclhost/testwebapp/test.jsp%20
    Apcahe不会把这个请求交给Tomcat,而是去读取对应目录下的的jsp文件,然后把内容写回,因此泄漏jsp代码。而采取文件分开存储的方式,apache就读取不到这个jsp了。
    以我一个实际运行着的系统为例:有以下两个目录:d:\work\data\website\
    这个目录下存放的是一个完整的webapp,但是后来发现代码泄漏,于是把*.jsp全部删除。
    只保留xml,xsl,js,css,jpg,gif,htm等文件d:\websphere\server\defaultwebapp\website\这个目录下也是一个完整的webapp(xml,xsl等文件可以被删除)。apache映射的根目录是d:\work\data\website\,然后转发请求的规则是*.jspWebsphere的webapp映射的根目录是:d:\websphere\server\defaultwebapp\website\。
    Apache与其它服务器的整合,或者是mod_proxy,或者mod_Rewrite或者mod_jk之类,
    归根到底的原理,就是对uri进行规则匹配,然后进行相应处理。,如果是不转发的请求,就直接读取相应静态文件,直接写回到客户端。如果是需要转发的请求,就转发给其它流程处理,然后获取回复,再写回到客户端。
    ps: context也并无神秘之处,如果理解简单一点,就是用来设置JSESSIONID这个cookie的Domain,呵呵。
      

  2.   


    不好意思,打错了,纠正一下:
    ps: context也并无神秘之处,如果理解简单一点,就是用来设置JSESSIONID这个cookie的Path,呵呵。
      

  3.   

    谢谢楼上二位仁兄的解说,呵呵。。:)现在还有一个问题是Httpd通过JK转发给Tomcat的URI里面如果包含中文内容的话将Tomcat下的应用程序无法正确识别,都成了“??”之类的字符。显然又是字符编码问题。但是如果直接访问Tomcat的端口的话就没有这个问题,所以应该是在Httpd通过JK转发的过程中出问题了。不知何故。Tomcat server.xml中对JK Connector的描述如下:<Connector  URIEncoding="GBK"
                connectionTimeout="0"
                enableLookups="true"
                maxProcessors="75"
                port="8009"
                protocol="AJP/1.3"
                protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
                redirectPort="8443">
    </Connector>将URIEncoding改为“UTF-8”之后也无法解决问题。目前还没弄明白到底是在哪一个环节丢失原字符编码的。
      

  4.   


    http.conf里有下面这一行没???
    AddDefaultCharset GBK
      

  5.   

    如果需要较高的安全性的话,一般建议静态页面和动态页面分开存放。
    有个问题.我以前也是apache+tomcat整合工作的,后来用struts来做,发现在apache+tomcat整合情况下,struts会出错,也许是我的配置有问题,我就把所有页面都放到tomcat下了,不知楼上的兄弟,能在整合的情况下,开发struts应用吗?
      

  6.   


    to  java_jing(大侠) :不太了解你出错的具体原因,所以不好判断,
    但是根据Http1.1协议规范以及mod_jk的AJP1.3协议原理,
    配置正确的情况下,是以Servlet容器里的实现框架是没有任何关系的
    (*.jsp也仅仅是个特殊的默认url-pattern映射,*.do则是Struts来处理的url-pattern映射)我现在能够猜测的又一种可能出错,那就是forward转向的view层是一个静态页面而不是动态页面,那么转发请求肯定是无法找到放在Apache目录下的静态页面。况且,如果所有的页面都放在Tomcat下了,利用Apache来处理静态页面的高效率已经不存在了,
    还搭上了一个请求转发的消耗,基本失去了整合的意义:(http.conf的示例:JkMount /clusterapp/servlet/* myloadbalancer
    JkMount /clusterapp/*.jsp myloadbalancer
    因为tomcat的admin就是strusts来实现的,而且它还对jsp进行了编译使用url-pattern映射来处理jsp
    ,因此不存在*.jsp文件,并且还使用了servlet规范中的表单验证。通过它可以说明一些问题了。下面是我让Tomcat的admin正常跑起来的配置:1.Apache下的静态页面路径:D:\apache\Apache2\htdocs\admin2.Tomcat下的webapp: 
    E:\web\tomcat54\server\webapps\admin(以上文件均是使用http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip直接解压所得)
    http.conf的配置:#禁止访问WEB_INF和META_INF目录。
     <Directory ~ "/WEB-INF/"> 
         Order allow,deny 
         Deny from all 
        </Directory>
         <Directory ~ "/META-INF/"> 
         Order allow,deny 
         Deny from all 
        </Directory>
    LoadModule jk_module modules/mod_jk.so 
    JkWorkersFile D:/apache/Apache2/conf/workers.properties 
    JkLogFile D:/apache/Apache2/logs/mod_jk.log 
    JkLogLevel info
    #JkLogLevel debug 
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " 
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories 
    JkRequestLogFormat "%w %V %T" 
    JkMount /admin/ myloadbalancer
    JkMount /admin/j_security_check myloadbalancer
    JkMount /admin/*.jsp myloadbalancer
    JkMount /admin/*.do myloadbalancer(尤其注意:/admin/和/admin/j_security_check这两个URL映射,
    如果没转发给Tomcat,是会出现404错误的)经过刚才的测试,Struts应用是完全正常的.接下来,把D:\apache\Apache2\htdocs\admin下的随便一个gif图片改名,
    然后在浏览器刷新,就会看到图片变成了红叉,因此可以证明静态资源是由Apache来处理的。个人观点:Apache与Tomcat的mod_jk方式整合,最主要是实现动态资源和静态资源的分工合作处理,以及负载均衡,如果这两项要求一个都没有实现,那么整合是没有实际意义的。
      

  7.   

    pigo兄的分析有理有据,难得。:)只是AddDefaultCharset GBK这一句对我这边的情况没有用处,按照apache官方文档的说法,AddDefaultCharset 指令只是在conf文件里面没有指定任何字符集设置的情况下才起作用,如果进行了其它字符集的设定,那么那AddDefaultCharset 指令是被忽视的。url转发字符集处理错误的情况如下:
    search.do?q=%E6%B1%89%E5%AD%97&cat_id=-1
    IE会自动把请求的双字节字符转换为utf8编码,直接发送给Tomcat可以正常处理,但是通过httpd转发之后就成乱码了。看来我还真的需要研究一下httpd的字符集处理问题(更有可能是jk的问题)。我的应用是基于Velocity+Struts+Hibernate的,没有JSP,事实上除了几个gif之外没有什么静态文件,用Apache+Tomcat实属下策,不过考虑以后可能的需求,才这么去做的。现在还有另一个悬而未解的问题就是使用虚拟主机的情况下,有时候可以通过匹配的域名访问,有时候又无法访问,例如昨天上午通过域名访问的时候一切正常,下午就死活连不上(404或500错误),而今天上午又一切正常,而期间什么都没动过。我都怀疑是不是httpd有bug。:(btw,加分到100先,黑黑。
      

  8.   

    很遗憾地告诉大家,关于乱码,我把Connector声明里面的 URIEncoding="UTF-8" 属性去掉就OK了。分析如下:IE所请求的URI已经是经过UTF-8编码,如果JK强制对已经经过UTF-8编码的URI再作一次UTF-8编码,那么自然就得到一个错误的结果了。:(
      

  9.   

    现在倒是Virtual Host的问题比较讨厌。从上午启动到现在却又没再出现问题。
      

  10.   

    呵呵,正打算说去掉  URIEncoding属性声明,呵呵。对了,如果没有启动tomcat,只启动Apache,在访问转发给Tomcat处理的请求(比如jsp)的时候也是返回500错误的。
    (不过我还没有设置为虚拟主机方式)
    使用mod_proxy方式的话,返回的则是502错误。
    以Apache和Tomcat的质量来看,最好不要一遇到问题(尤其是无法轻易重现的)就把原因归结为bug,还是先找找其它原因。
      

  11.   

    也可能是跟网络环境有关,我在自家的机器上配置虚拟主机是屡试不爽,从不失手,但是在公司的机器上就老出问题,而且每次出问题的时候ping自己的域名都是没问题的,也就是说dns可以正确地把域名转换为IP,我现在怀疑是DNS在转换IP的时候把来自浏览器的HTTP请求HEADER给丢掉了,我用的是基于域名的vhost。
      

  12.   

    有什么办法或什么软件可以在HTTP请求到达APACHE之前将其截获并作分析呢?
      

  13.   

    客户端的工具:achilles_0_27.zip 功能无比强大IEHttpheaders 1.52 ,简单好用服务器端,Tomcat的server.xml,
    取消下面一行的注释,就可以在控制台输出Request的所有信息。 <!-- <Valve className="org.apache.catalina.valves.RequestDumperValve"/> -->
      

  14.   

    to pigo(少壮且行英雄梦,迟暮归守温柔乡) 
    "我现在能够猜测的又一种可能出错,那就是forward转向的view层是一个静态页面而不是动态页面,那么转发请求肯定是无法找到放在Apache目录下的静态页面。"的确是这样啊!!!!!
    如果我在tomcat下有一个应用是test.
      

  15.   

    如果我在tomcat下有一个应用是test.c:\tomcat5\webapps\test  有struts 应用!!!!在apache下有一个c:\apache\htdocs\testhtm怎么样让两者能结合起来,
    下面是我httpd.conf中的一段:LoadModule jk_module modules/mod_jk.dll 
     
     JkWorkersFile "c:/tomcat5/conf/workers.properties" 
     JkMount /servlet/* ajp13 
      JkMount /test/* ajp13 
       JkMount /addressbook/* ajp13 
     JkMount /*.jsp ajp13老兄:你的JkMount /admin/ myloadbalancer
    JkMount /admin/j_security_check myloadbalancer
    JkMount /admin/*.jsp myloadbalancer
    JkMount /admin/*.do myloadbalancer
    myloadbalancer是什么啊.
    我现在把htm页面也放在tomcat下,按你的话说:"利用Apache来处理静态页面的高效率已经不存在了,
    还搭上了一个请求转发的消耗,基本失去了整合的意义:(
    "
    所以指点一下,怎么整合,实现struts应用!!!谢谢!!!!!
      

  16.   

    to java_jing(大侠) ,
    你的基本只要下面这样就ok了:LoadModule jk_module modules/mod_jk.so 
    # Apache的目录映射
    Alias /test c:/apache/htdocs/testhtm
    JkWorkersFile "c:/tomcat5/conf/workers.properties"  
    #假如首页是jsp,则需要下面一行,
    #如果是静态html,则需要把下面一行注释掉,
    #不应该把请求转给Tomcat了JkMount /test/ ajp13
    #除非用了form-auth,否则下面这行是不必要的
    JkMount /test/j_security_check ajp13
    JkMount /test/*.jsp ajp13
    JkMount /test/*.do ajp13
    ps:所有在web.xml里的servlet映射也需要转发过来。如果forward的不是动态页面,建议使用redirect而不是forwrd。
    (struts的config里好像是可以设置Action的请求转发方式的?我没有亲自试过,不做确定的保证)
    myloadbalancer是我在配置集群负载均衡时设置的worker,别无它用。
      

  17.   

    照你的做了,
    在testhtm下有login.htm页面,servlet-config.xml中,
    <action  path="/createuser"  type="com.cstmail.login.UserAction"          
                       name="userForm"     scope="request"
                       validate="true"     input="/createuser.jsp">       
                  <forward name="userCreated" path="/login.htm"/> 
              </action>
    但提示:
    HTTP Status 404 - /test/login.htm它仍然按照test/login.htm找,而不是testhtm/login.htm
      

  18.   


    按照test/login.htm来找就是正确的。
    只是不知道你是否仔细看到我下面的这一行???????Alias /test c:/apache/htdocs/testhtm如果你不想写这一行,那就把testhtm改名字成test.
      

  19.   

    但是错误是找不到网页,如果页面是在tomcat的test目录下自然能找到,现在我把它放到apache的testhtm下了,HTTP Status 404 - /test/login.htm
      

  20.   

    TTP Status 404 - /test/login.htm--------------------------------------------------------------------------------type Status reportmessage /test/login.htmdescription The requested resource (/test/login.htm) is not available.
      

  21.   

    呵呵。。再次谢过pigo兄。:)<Valve className="org.apache.catalina.valves.RequestDumperValve"/>打开之后从log文件中获得了详细的请求应答信息,正合吾意,虽然以前也写过一个jsp通过request对象来做这个工作,不过它(jsp)获得的东西是在容器转交控制器之后所以对目前遇到的问题就没有用武之地了,我想RequestDumper会帮我查清楚Tomcat下的虚拟主机工作不正常的真正原因。对于Httpd,不知道有没有相关的选项,我还没有去仔细查httpd.conf文件,不过我想有achilles就足够了,明天去到公司再试一下。:)