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的这个应用
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的这个应用
解决方案 »
- Object 按类型输出值
- 求教各位ibatis"数据大小超出此类型的最大值"的异常,内详~
- Hql语句可以这样写么
- 帮忙解决js验证吧
- servlet转换为jsp时出错
- 怎么样可以让多个 text 控件都执行同一个消息处理函数
- D:\Program%20Files\Apache%20Software%20Foundation\Tomcat%205.5\webapps %20换成空格菜菜菜快来帮帮我
- 请大家帮我定位这个OutOfMemoryError的问题。是数据库?还是连接池?抑或是Java ?
- soap 如何把返回的xml文档在浏览器上显示?!多谢!
- aspectj 处理异常问题
- weblogic配置问题,请哪位大虾帮忙啦!!!
- 请问高手一个页面中能否创建两次CONNECTION对象
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,呵呵。
不好意思,打错了,纠正一下:
ps: context也并无神秘之处,如果理解简单一点,就是用来设置JSESSIONID这个cookie的Path,呵呵。
connectionTimeout="0"
enableLookups="true"
maxProcessors="75"
port="8009"
protocol="AJP/1.3"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443">
</Connector>将URIEncoding改为“UTF-8”之后也无法解决问题。目前还没弄明白到底是在哪一个环节丢失原字符编码的。
http.conf里有下面这一行没???
AddDefaultCharset GBK
有个问题.我以前也是apache+tomcat整合工作的,后来用struts来做,发现在apache+tomcat整合情况下,struts会出错,也许是我的配置有问题,我就把所有页面都放到tomcat下了,不知楼上的兄弟,能在整合的情况下,开发struts应用吗?
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方式整合,最主要是实现动态资源和静态资源的分工合作处理,以及负载均衡,如果这两项要求一个都没有实现,那么整合是没有实际意义的。
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先,黑黑。
(不过我还没有设置为虚拟主机方式)
使用mod_proxy方式的话,返回的则是502错误。
以Apache和Tomcat的质量来看,最好不要一遇到问题(尤其是无法轻易重现的)就把原因归结为bug,还是先找找其它原因。
取消下面一行的注释,就可以在控制台输出Request的所有信息。 <!-- <Valve className="org.apache.catalina.valves.RequestDumperValve"/> -->
"我现在能够猜测的又一种可能出错,那就是forward转向的view层是一个静态页面而不是动态页面,那么转发请求肯定是无法找到放在Apache目录下的静态页面。"的确是这样啊!!!!!
如果我在tomcat下有一个应用是test.
下面是我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应用!!!谢谢!!!!!
你的基本只要下面这样就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,别无它用。
在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
按照test/login.htm来找就是正确的。
只是不知道你是否仔细看到我下面的这一行???????Alias /test c:/apache/htdocs/testhtm如果你不想写这一行,那就把testhtm改名字成test.