Eclipse Java EE IDE 中使用Tomcat 5X / 6X 的一些问题(配置,发布相关)
一直都是使用MyEclipse,因为涉及都版权,都是在“学习和交流”的名义之下使用MyEclipse。但是实际的商业开发中,团队要考虑项目的成本以及项目的需要(效率或者功能需要),所以Eclipse对于一些中小型项目应该是够用了,比起MyEclipse集成化的IDE,方便自然不用说,但是性能可能是一个值得考虑的因素,所以Eclipse用来开发也可以作为一种不错的选择。
用习惯了MyEclipse的开发者换为用Eclipse开发web项目,突然有些不习惯了,JavaWeb项目变成了Dynamic/ Static Web Project, 安装了sysdeo的TomcatPlugin之后还有有Tomcat Project。 让人一下子不习惯了。其实从这很可以理解MyEclipse收费的原因了:要方便,请花钱。
这里不再熬述。
最近使用Eclipse J2EE IDE +Tomcat 5.5开发部署了几个小项目,有些心得给大家分享,其中很多都是在网上查的文的,也解决了不少问题,感谢网友的帮助!
1、 Web Project的部署
前提:(1)安装配置好tomcat, 环境变量,TOMCAT_HOME
(2)配置好EClipse IDE的 Installed JREs
(3) 确保tomcat可以正常跑起来(%TOMCAT_HOME%/bin/startup.bat)
建立一个简单Web Project(例如 Dynamic Web Project),简单编写,加一个JSP之类的,编写好了之后, 怎么发布? 习惯性的打开了Eclipse的 Sever视图,可是里面什么都没有,右键点击NEW-->Server, 按照一般正常步骤建立。建立之后就会在Project视图里面看到Server的项目,而且有自己的配置文件。(这里有有一个问题,待会说)
然后正常做法,把项目在Tomcat里面跑起来。Console里面显示正常启动之后,打开浏览器,输入tomcat主页地址测试tomcat正常跑起来没有,例如 Http://localhost:8080/ ,结果却是404,很让人诧异,再检查tomcat console, 没有问题啊! 尝试检查%TOMCAT_HOME%的webapp目录,webapp的ROOT目录是有资源的,但是发现没刚刚发布的项目,work目录也没有!!这是怎么回事? 尝试访问Test项目的资源例如Http://localhost:8080/Test/index.jsp, 却可以正常访问!!这是为什么!
原来是如果使用了Eclipse建立的Server和tomcat来发布Web项目, 默认的发布路径不是原tomcat安装路径,而是eclipse自己设置的路劲,而且使用的是Server自己的配置文件,即上面的右边的图例的配置文件,所以相关配置是在这里设置的,在tomcat的设置将无法生效。
Server发布路径是:workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmpx
这里workplace 就是Eclipse的Workplace, tmpx中x从0开始命名,即配置多个服务时的命名
PS。解释一下刚才的输入Http://localhost:8080/ 报404而访问项目资源却可以:大家都知道Http://localhost:8080/ 这个地址最后的“ / ” 代表的是tomcat的webapp里面的ROOT资源,相关的管理界面在manager里面,这是tomcat默认的。但是eclipse的Server发布tomcat web项目时,相当于使用了tomcat的一个副本,这个tomcat在使用时按照自己的配置来处理,所有的信息自己复制了一遍到workplace, 但是我们发现在 这个副本tomcat(即上图后边的相关配置文件)的配置文件web.xml 以及 ROOT目录(workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ROOT)会发现,web.xml配置了<welcome-file-list>,但是在ROOT目录里面却没有任何资源,所以包404是正常的。如果你需要它显示tomcat主页,到%TOMCAT_HOME%的webapp里面把docs,manager,ROOT目录都拷贝过来就OK了。
当然,要修改这个发布目录也是可以的。在Server视图里面双击已经配置好的Tomcat 或者右键-->Open ,在Overview选项卡里面就会看到项目的配置,例如port , path , name等等,, 在Server Location里面 就是这个Tomcat容器的的发布路径,根据需要修改,默认的就是刚才说的那个workplace的地址。这里会有一个问题,当tomcat已经加载了项目的时候就不能修改了,必须把 tomcat clean一下,才可以修改。
本文为原创,自己的心得,欢迎讨论学习!
如需转载,请标明源地址。谢谢! cnblogs.com/lzsu1989
Tomcat启动--警告: [SetPropertiesRule]
2010-8-20 21:41:03 org.apache.catalina.core.AprLifecycleListener init
严重: An incompatible version 1.1.9 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.17
2010-8-20 21:41:05 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:WebDemo1' did not find a matching property.
2010-8-20 21:41:06 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2010-8-20 21:41:06 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 5730 ms
2010-8-20 21:41:07 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2010-8-20 21:41:07 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.26
2010-8-20 21:41:10 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2010-8-20 21:41:11 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2010-8-20 21:41:12 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/968 config=null
2010-8-20 21:41:12 org.apache.catalina.startup.Catalina start
信息: Server startup in 5414 ms
2010-8-20 21:43:31 org.apache.catalina.core.StandardContext reload
信息: Reloading this Context has started
解决办法:
双击Tomcat v6.0 Server at localhost 会打开Tomcat v6.0 Server at localhost-config对话框
1.在Server Option选项下勾选上Public moudle context to spareate XML files
2.重启TOMCAT后这个警告: [SetPropertiesRule]就没有了
Apache整合Tomcat
一、先从J2EE工程的通用架构说起
这是一个通用的Web即B/S工程的架构,它由:
ü Web Server
ü App Server
ü DB Server
三大部分组成,其中:
² Web Server
置于企业防火墙外,这个防火墙,大家可以认为是一个CISCO路由器,然后在CISCO路由器上开放了两个端口为:80和443。
80端口:用于正常的http访问
443端口:用于https访问,即如果你在ie里打入https://xxx.xxx.xx这样的地址,默认
走的是443这个端口。
WebServer专门:
用于解析HTML、JS(JavaScript)、CSS、JPG/GIF等图片格式文件、TXT、
VBSCRIPT、PHP等一切一切“静态”网页内容。
² App Server
置于企业防火墙内,它和Web Server之间的连接必须且一定为内部IP连接。
外部IP:即Internet IP地址,我们的web服务器一般会有一个内部IP一个外部IP,因此在这里,我们的App Server没有任何外部IP,只有内部IP,所以我在这边说App Server与Web Server只能以内部IP形式连接。
打比方说我们用的是tomcat,它的端口为8080,那么这个ip地址上的8080端口只能由任何内部ip才能访问,外部的internet是访问不了的,这样做就是为了安全。
App Server用于解析我们的任何需要Java编译器才能解析的“动态”网页,其实App Server本身也能解析任何静态网页的。
那么我们这样来想一下:
我们让负责专门解析静态网页的Web Server来解析html等内容,而让App Server专门用于解析任何需要Java编译器才能解析的东西,让它们“两人”各司其职。这样作的好处:
1) 为App Server“减压”,同时也提高了performance
2) 不用再把8080这个端口暴露在internet上了,也很安全,必经我们的app server上可是有我们的代码的,就算是编译过的代码也容易被“反编译”,这是很不安全的。
3) 为将来的进一步的“集群扩展”打好了基础
² DB Server
打比方说我们用的是Oracle,它需要通过1521与App Server进行连接是不是?那么这个1521我们称为数据库连接端口,如果把它暴露在Internet上,是不是在危险了点?就算我们的密码很复杂,但对于高明的黑客来说,要攻破你的口令也只是时间上的问题而己。
因此我们把我们的DB Server也和App Server一样,置于内网的防火墙。任何的DB连接与管理只能通过内网即在公司企业内部来访问,就是这个道理。
2.1 Oracle
数据加的安装与配置DB(Oracle)我已经为大家准备好了,连接信息为:
IP: |
10.225.10x.xx |
Port: |
1521 |
Username/Password: |
xxx/xxx |
Sid: |
Jcoedb1 |
url: |
jdbc:oracle:thin:@10.225.10x.xx:1521:xxx |
所以,根据上述的架构,我们可以把如下这样的一份清单丢给NSS或者是相关的网络管理部门,让他们给我们开通相应的端口:
Web Server |
对外IP: xxx.xxx.xxx.xxx 向internet开通80与443端口 |
App Server |
对内IP: 10.225.xxx.xxx 只对10.225.段的ip开放8080,8009等端口, |
Db Server |
对内IP: 10.225.xxx.xxx 只对10.225.段的ip开放1521端口 |
直接解压tomcat至你的本地如:d:\tomcat,我这边用的目录名叫tomcat2,大家随意,最好名字能够越简单越好d:\tomcat或者c:\tomcat就行,不要放得太“深”。
我们在这边将安装Apache For Win 2.2.x,它将占用你机器的80和443端口。因此如果你机器上有任何程序占用你的80和443端口,必须将它关闭掉,比如说:
我们装有微软的IIS,这本身也是一个WebServer,那么请你将它关闭:
ControlPanel->Administrative Tools->Service,找到IISAdmin和,将它全部关闭并将启动方式设为:manual以便于不用每次重启后再要去手动关闭一下。
然后用netstat –ano找到任何还在占用80端口的程序,将它关闭掉。
2.4开始安装Apache Http Server
我们将安装这个版本的apache http server作为我们今后一直使用的Web Server
这边的server name你们要填入自己的server的真实名,不能用我这个,这个servername如:shnlap93.cts.com只能够我用,这个名称是全局唯一的,和你的IP一样。
选全部安装
装完后你会多出一个这样的图标来,点击该图标,里面有用于控制apache http server的启动、停止与重启等操作选项。同时在你们的“服务”面板中,也能发现这样的一个服务项,它启动时默认是随着系统的启动而启动的,我们把它改成“手动”吧,因为将来我们还要安装IBM Http Server来作练习。
装完后,在Apache2.2启动的前提下,打开一个ie输入http://localhost,你将会得到这样的一个页面,就说明你的Apache的安装是成功的。
2.5 Apache的配置
学Java的人,必须会这个Apache的配置,要不然你怎么模拟环境、搭建环境和架构环境?光会Coding是远远不够的,你将永远只配作个码农。。。嘿嘿嘿!有很多人发觉到了后面JAVA学不上去了,关键因素在于:配置。
你会配环境了,那么你就能模拟任何客户方、开发方的环境。
你会配环境了,你的代码将来上线时才能成功运行。
你会配环境了,所以整个工程的技术核心就是你。
跟着我的教程,你们将会安装和运行达近百个各种软件与配置,搞得你一股臭味一股臭味!!
你准备好了没有?
当然,不用怕,因为我的配置都是实际运行的环境,所以网上的一些东西你可以不用去看,因为很多人都是在网上进行拷贝、复制,有时也不经过验证,会让你走很多的弯路到头来还是落得个BUG一天世界,就看我的教程吧。
Apache的配置主要集中在httpd.conf文件,它位于你的安装目录,比如:
D:\tools\httpd\conf\
我们用ultraedit或者相关文本编辑工具打开它,来看它的内容:
先来查找到如下这一行:
#ServerName
我们可以得到如下这一行内容:
#ServerName shnlap93.cts.com:80 |
这就是我们的主机名了,我们可以将前面的“#”去掉,并将其改为:
ServerName 10.225.106.35:80 |
改完后存盘,在重启你的Apache2.2前我们先测试一下我们的Apache的配置文件是否改得对:
如果在你点了Test Configuration后,黑屏一闪而过,说明你的改动无误,否则这个黑屏会一直停留在当前状态,并且告诉你,你的配置改动有错,错在哪里。
重新启动你的Apache
找到如下这行:
DocumentRoot
你会发下有这样的一行内容:
DocumentRoot "D:/tools/httpd/htdocs" |
这个叫作DocumentRoot即webroot,即:发布目录,发布在这个目录下的任何工程都会在Apache服务开启时被装载成标准的web工程,我们现在动手来把这个WebRoot定位到我们自己的发布目录中去吧。
DocumentRoot "d:/www" |
我们把它改到了d盘的www目录中去了,然后我们在该目录中放入一个index.html文件,内容为:
<html><body><h1>Hey man, apache works!</h1></body></html> |
重启我们的Apache服务,来测试一下:
嘿嘿,我们得到了什么?禁止访问,为什么?
找到下面这一段:
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow deny from all </Directory> |
看到了没?
现在,把这个”deny from all”改成”allow fromall’吧。
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow allow from all </Directory> |
修改完后重启你的Apache服务
Ok,我们的Apache的发布目录已经成功更改到了d:\www目录下了,我们再来做一个实验:
我们在IE浏览器中输入: http://localhost/css/,我们看到了什么?
这还了得,用户如果是个初级黑客都可以知道我们的服务器上有哪些文件,哪些目录甚至可以直接看到我们的文件内容,怎么办?
找到下面这行
Options FollowSymLinks indexes |
把它注掉改成下面这样
#Options FollowSymLinks indexes Options None |
不要急,再往下找,还有
Options Indexes FollowSymLinks |
又来一个,再改掉
#Options Indexes FollowSymLinks Options None |
改完这两条后重启你的Apache服务
再次打开一个新的IE,输入:http://localhost/css/,我们看到了如下的界面:
好了,Apache的基本配置完成了即:
1) 基本的安全配置,不允许目录访问
2) 把WebRoot改到另一个物理目录上而不使用Apache自带的WebRoot目录
2.6整合Apache与Tomcat
Apache(Web Server)负责处理HTML静态内容;
Tomcat(App Server)负责处理动态内容;
其实就是上述这样的一个架构,下面是原理
1) Apache装有一个模块,这个模块叫mod_jk
2) Apache通过80端口负责解析任何静态web内容
3) 任何不能解析的内容,用表达式告诉mod_jk,让mod_jk派发给相关的app server去解释。
通过上述的文字描述我们可以得知:
1) 我们需要在Apache中先装一个mod_jk
2) 我们需要在httpd.conf中写点表达式
下面来实现。
1) 把mod_jk-1.2.31-httpd-2.2.3.so手工copy进我们的Apache安装目录的modules目录下,这个文件的全名叫: mod_jk-1.2.31-httpd-2.2.3.so,大家可以从ftp上的“/JavaArchitect/mod_jk/”目录中获取,因为这个文件是我用C++在本地重新编译过的,网上下载的是src即源码,省去大家再去编译的时间了,而且一些其它网上下载的mod_jk.so是无法使用的。
2) 用ultraedit打开httpd.conf文件,跑到文件最后面加入以下几行:
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so JKWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log <VirtualHost *> ServerAdmin localhost DocumentRoot d:/www/ ServerName localhost DirectoryIndex index.html index.htm index.jsp index.action ErrorLog logs/shsc-error_log.txt CustomLog logs/shsc-access_log.txt common
JkMount /*WEB-INF ajp13 JkMount /*j_spring_security_check ajp13 JkMount /*.action ajp13 JkMount /servlet/* ajp13 JkMount /*.jsp ajp13 JkMount /*.do ajp13 JkMount /*.action ajp13
JkMount /*fckeditor/editor/filemanager/connectors/*.* ajp13 JkMount /fckeditor/editor/filemanager/connectors/* ajp13 </VirtualHost> |
关键的是这两句:
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
JKWorkersFile conf/workers.properties
代表:
ü Apache载入一个额外的插件,用于连接tomcat。
ü 连接时的配置参数描述位于Apache安装目录的/conf目录下的一个叫workers.properties文件中,mod_jk一般使用ajp13协议连接,使用的是tomcat的8009端口。
3) Worker.properties文件内容如下:
workers.tomcat_home=d:/tomcat2 workers.java_home=C:/jdk1.6.32 ps=/ worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13 |
4) 告诉我们的Apache,哪些是要交给tomcat来解析,除此之外都由Apache本身来解析:
<VirtualHost *> ServerAdmin localhost DocumentRoot d:/www/ ServerName localhost DirectoryIndex index.html index.htm index.jsp index.action ErrorLog logs/shsc-error_log.txt CustomLog logs/shsc-access_log.txt common
JkMount /*WEB-INF ajp13 JkMount /*j_spring_security_check ajp13 JkMount /*.action ajp13 JkMount /servlet/* ajp13 JkMount /*.jsp ajp13 JkMount /*.do ajp13 JkMount /*.action ajp13
JkMount /*fckeditor/editor/filemanager/connectors/*.* ajp13 JkMount /fckeditor/editor/filemanager/connectors/* ajp13 </VirtualHost> |
大家看到没,所有的/servlet/*都由tomcat负责解析,所有的jsp, .do, .action都由tomcat解析。
此处还有一个特殊的/fckeditor,这个是我们使用的一个博客编辑器,这个因为是servlet的,因此也需要交给tomcat铁析。
5) 将/cbbs工程布署到tomcat的webapps目录下
6) 将/cbbs同样手工copy一份到d:/www目录下
7) 删除d:/www/cbbs/WEB-INF这个目录,嘿嘿,因为d:/www下的东西是由Apache解析的,所有的WEB-INF下的都是Java,我们只需要布署在tomcat下即可,是不是?
8) 重启tomcat,重启Apache,在ie中直接输入: http://localhost/cbbs,使用sally/abcdefg登录,操作一下,一切成功
Oh…yeah, tomcat+apache一步搞定。
三、用于实验的cbbs工程配置
最后附上cbbs布署需要用到的配置,相关的工程可通过ftp的” /Java Architect/Project/”下的cbbs.zip来获取。
ü 在tomcat中打开server.xml加入:
<Resource driverClassName="oracle.jdbc.OracleDriver" factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="25" maxIdle="100" maxWait="5000" name="jdbc/eltds" password="xxx" type="javax.sql.DataSource" url="jdbc:oracle:thin:@10.225.101.51:1521:jcoedb1" username="xxx"/> |
和
<Context crossContext="true" docBase="D:/upload" path="/uploadpic" reloadable="true"/> <Context docBase="cbbs" path="/cbbs" reloadable="true"/> |
ü 手工在d盘根目录建立一个upload目录,在此目录内再建立一个image目录。
ü 在tomcat中打开context.xml加入
<ResourceLink name="jdbc/cbbsds" type="javax.sql.DataSource" global="jdbc/cbbsds"/> |
apache与tomcat集成方式
Apache HTTP Server 与 Tomcat 的三种连接方式介绍
整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能、利用 Web 服务器来做负载均衡以及容错、无缝的升级应用程序。本文介绍了三种整合 Apache 和 Tomcat 的方式。
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。
既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个:
1. 提升对静态文件的处理性能
2. 利用 Web 服务器来做负载均衡以及容错
3. 无缝的升级应用程序
这三点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的 HTTP 服务器也就只有 apache 的 http server 了,它跟 tomcat 的结合是最紧密和可靠的。
接下来我们介绍三种方法将 apache 和 tomcat 整合在一起。
JK
这是最常见的方式,你可以在网上找到很多关于配置JK的网页,当然最全的还是其官方所提供的文档。JK 本身有两个版本分别是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已经废弃了,以后不再有新版本的推出了,所以建议你采用版本 1。
JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置,如下图所示:
图 1:监控以及管理的页面 jkstatus
在这个图中我们可以看到当前JK配了两个连接分别到 8109 和 8209 端口上,目前 s2 这个连接是停止状态,而 s1 这个连接自上次重启后已经处理了 47 万多个请求,流量达到 6.2 个 G,最大的并发数有 13 等等。我们也可以利用 jkstatus 的管理功能来切换 JK 到不同的 Tomcat 上,例如将 s2 启用,并停用 s1,这个在更新应用程序的时候非常有用,而且整个切换过程对用户来说是透明的,也就达到了无缝升级的目的。关于 JK 的配置文章网上已经非常多了,这里我们不再详细的介绍整个配置过程,但我要讲一下配置的思路,只要明白了配置的思路,JK 就是一个非常灵活的组件。
JK 的配置最关键的有三个文件,分别是
httpd.conf
Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息
workers.properties
到 Tomcat 服务器的连接定义文件
uriworkermap.properties
URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。
其中第二、三个配置文件名都可以自定义。下面是一个典型的 httpd.conf 对 JK 的配置
# (httpd.conf)
# 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk.so
#
# Configure mod_jk
#
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn
接下来我们在 Apache 的 conf 目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下
#
# workers.properties
#
# list the workers by name
worker.list=DLOG4J, status
# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13
# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1
worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1
worker.status.type=status
以上的 workers.properties 配置就是我们前面那个屏幕抓图的页面所用的配置。首先我们配置了两个类型为 ajp13 的 worker 分别是 s1 和 s2,它们指向同一台服务器上运行在两个不同端口 8109 和 8209 的 Tomcat 上。接下来我们配置了一个类型为 lb(也就是负载均衡的意思)的 worker,它的名字是 DLOG4J,这是一个逻辑的 worker,它用来管理前面配置的两个物理连接 s1 和 s2。最后还配置了一个类型为 status 的 worker,这是用来监控 JK 本身的模块。有了这三个 worker 还不够,我们还需要告诉 JK,哪些 worker 是可用的,所以就有 worker.list = DLOG4J, status 这行配置。
接下来便是 URI 的映射配置了,我们需要指定哪些链接是由 Tomcat 处理的,哪些是由 Apache 直接处理的,看看下面这个文件你就能明白其中配置的意义
/*=DLOG4J
/jkstatus=status
!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J
相信你已经明白了一大半了:所有的请求都由 DLOG4J 这个 worker 进行处理,但是有几个例外,/jkstatus 请求由 status 这个 worker 处理。另外这个配置中每一行数据前面的感叹号是什么意思呢?感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。
通过对 workers.properties 和 uriworkermap.properties 的配置,可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。您不妨动手试试!
http_proxy
这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。
http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。一个最简单的配置如下
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/
在这个配置中,我们把所有 http://localhost 的请求代理到 http://localhost:8080/ ,这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外。我们同样可以利用 mod_proxy 来做负载均衡,再看看下面这个配置
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
配置比 JK 简单多了,而且它也可以通过一个页面来监控集群运行的状态,并做一些简单的维护设置。
图 2:监控集群运行状态
ajp_proxy
ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改为:
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
采用 proxy 的连接方式,需要在 Apache 上加载所需的模块,mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、 mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式则需要加载 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 则需要加载 mod_proxy.so 和 mod_proxy_ajp.so这两个模块。
三者比较
相对于 JK 的连接方式,后两种在配置上是比较简单的,灵活性方面也一点都不逊色。但就稳定性而言就不像 JK 这样久经考验,毕竟 Apache 2.2.3 推出的时间并不长,采用这种连接方式的网站还不多,因此,如果是应用于关键的互联网网站,还是建议采用 JK 的连接方式。
参考资料
关于作者刘冬,一直使用 J2EE/J2ME 从事移动互联网方面的开发。您可以通过 Java *人网站来跟他联系,网址是:
,另外他的邮件地址是
[email=javayou@gmail.com?cc=]javayou@gmail.com[/email] 。
Apache+JK+Tomcat负载平衡配置
2006-04-12 来源:未知 作者:未知
网上关于Apache + JK + Tomcat的集群配置例子很多,按着例子配置下来,基本都能运行,不过,在一些重要的地方却没有进一步的说明。这次公司一个产品就是采用Apache+JK+Tomcat集群,在整个配置、测试过程中,遇到了许多的问题,经过不断测试、摸索,最后总算是搞定了,性能也达到了预期的目标。针对网上的例子,感觉有必要再详细的介绍一下我的配置过程,对一些要特别注意的地方进行补充。
集群有别于分布式的解决方案,它采用的是每台服务器运行相同应用的策略,由负责平衡的服务器进行分流,这对提高整个系统的并发量及吞吐量是更有效的办法。而集群对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群),状态复制需要在各服务器间复制应用状态,而负载平衡则不用,每台服务器都是独立的。实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。
对于集群的其它基础知识,在此就不再做累赘。以下就这次Apache + JK + Tomcat的负载平衡配置进行总结,重点关注整个配置及注意事项。
准备软件
1、 Tomcat或JBoss(本文档中采用的是JBoss4.0.2);
2、 apache2.0.54是开源的Web服务器,下载地址为:
http://www.apache.org/dist/httpd/binaries/
3、 mod_jk-1.2.14-apache-2.0.54.so模块,jk是mod_jserv的替代者,它是Tomcat-Apache插件,为Apache和Tomcat的连接器,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用,当前的最新版本为1.2.15,不过不同JK版本与不同的Apache版本之间的搭配有一些差异,有的甚至配不起来。JK2是符合apache2.x系列的新品,但由于其配置太过麻烦,使用的人很少,所以目前已停止开发,所以我们采用了jk连接器,下载地址:
http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
。
集群与负载平衡
使用mod_jk默认的以轮循方式进行平衡负载,假设有四个服务器节点,有10个请求,则四个节点分别接受请求编号如下:
节点1
节点2
节点3
节点4
而集群方式也是使用这种方法进行平衡。Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。
集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。
但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的Session信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。
具体采用负载平衡还是集群,这要看应用的需求了。
安装配置Apache
1、下载Apache的安装程序apache_2.0.54-win32-x86-no_ssl.exe后,安装很简单,一路回车,就此略过。
2、安装完毕后,将下载的mod_jk-1.2.14-apache-2.0.54.so复制到Apache安装目录下的modules子目录中。
3、然后进入Apache安装目录下的conf子目录中,打开httpd.conf配置文件,在最后插入以下一行:
Include conf/mod_jk.conf
4、 在conf子目录下,建立一个新的配置文件:mod_jk.conf,此文件为Apache加载连接器的配置文件,文件名可修改,但要与httpd.conf中Include的文件名一致,内容如下:
# Load mod_jk module. Specify the filename
# of the mod_jk lib you’ve downloaded and
# installed in the previous section
#加载mod_jk模块
LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so
# Where to find workers.properties
JkWorkersFile conf/workers2.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# 请求分发配置,可以配置多项
JkMount /* loadbalancer
#关掉主机Lookup,如果为on,很影响性能,可以有10多秒钟的延迟。
HostnameLookups Off
注:蓝色加粗的两行是重点,第一句是Apache加载JK模块用的;第二句为配置哪些URL请求将由负载平衡器来处理。
5、 在conf子目录下,建立一个新的配置文件:workers2.properties,此文件为负载平衡的配置文件,文件名不能修改,这是JK默认的名字,内容如下:
worker.list=loadbalancer
# Define the first node...
worker.server99.port=8009
worker.server99.host=192.168.11.99
worker.server99.type=ajp13
worker.server99.lbfactor=1
worker.server99.local_worker=1
worker.server99.cachesize=1000
worker.server99.cache_timeout=600
worker.server99.socket_keepalive=1
worker.server99.socket_timeout=0
worker.server99.reclycle_timeout=300
worker.server99.retries=3
# Define the second node...
worker.server202.port=8009
worker.server202.host=192.168.11.202
worker.server202.type=ajp13
worker.server202.lbfactor=1
worker.server202.local_worker=1
worker.server202.cachesize=1000
worker.server202.cache_timeout=600
worker.server202.socket_keepalive=1
worker.server202.socket_timeout=0
worker.server202.reclycle_timeout=300
worker.server202.retries=3
# Now we define the load-balancing behaviour
worker.loadbalancer.type=lb
worker.retries=3
worker.loadbalancer.balance_workers=server99 ,server202
worker.loadbalancer.sticky_session=true
worker.loadbalancer.sticky_session_force=true
注:以上定义了两个worker,一个为server99,另一个为server202,定义了一个负载平衡服务器loadbalancer,其中标蓝色的为重点配置项,相关的详细说明可以看官方的网站文档:
http://tomcat.apache.org/connectors-doc/
,其它节点的定义可以直接Copy,修改一下节点名及IP就好了。
A、worker.list=loadbalancer
设定工作的负载平衡器,各Tomcat节点不能加入此列表。
B、worker.server99.lbfactor
负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为1:1,则为平均分配。
C、worker.loadbalancer.balance_workers=server99,server202
指定此负载平衡器负责的Tomcat应用节点。
D、worker.loadbalancer.sticky_session=true
此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。
E、worker.loadbalancer.sticky_session_force=true
如果上面的sticky_session设为true时,建议此处也设为true,此参数表明如果集群中某台Tomcat服务器在多次请求没有响应后,是否将当前的请求,转发到其它Tomcat服务器上处理;此参数在sticky_session=true时,影响比较大,会导致转发到其它Tomcat服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。
6、Apache服务器的配置文件httpd.conf中,默认有三个参数对性能的影响比较大,但根据不同的性能要求,参数的表现又不一样,太小并发提不上去,太大性能反而不好,建议根据项目的需要,实际做个测试,如并发要求800的话,可以设定为:
#一个连接的最大请求数量
MaxKeepAliveRequests 1000(值为0,则不限制数量)
#每个进程的线程数,最大1920。NT只启动父子两个进程,不能设置启动多个进程
ThreadsPerChild 1000(最大为1920)
#每个子进程能够处理的最大请求数
MaxRequestsPerChild 1000(值为0,则不限制数量)
这三个参数要根据不同的需求,不同的服务器进行调整。
安装配置Tomcat或JBoss
1、对于Tomcat或JBoss的安装,这里不做说明,目前我们是采用Apache+JBoss,不过,JBoss也是用的Tomcat,所以这里的配置也是适合Tomcat的;
2、对于JBoss的配置,很简单,只需要改两个地方就可以了:
第一个地方:进入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打开server.xml,大约在第32行左右,有,在其中加入一个参数,变为:
第二个地方:进入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\META-INF目录,打开jboss-service.xml,大约在110行,有false,将其改为:
true
这里有一个需要特别注意的地方,JBoss的Tomcat中,关于AJP连接协议的默认配置,对于大并发量是不够用的,要做一些修改,进入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打开server.xml,找到的地方,这里是定义AJP连接器的地方,它的配置中没有maxThreads项,默认为200,我们可以做修改:
emptySessionPath="true" enableLookups="false" redirectPort="8443"
protocol="AJP/1.3" maxThreads="3000"/>
maxThreads的值要看你的并发量多大,设置太大也不好。
运行
至此,整个配置全部完成,注意一点是,在各JBoss节点,重启或新增加一个JBoss节点时,需要重新启动Apache,而对于服务器群中某个JBoss节点shutdown,Apache会自动侦测,不用重新启动。
如果在运行过程中,群中的某个JBoss节点shutdown,则已登录到此服务器上的用户的请求将出错,此服务器负责的session将丢失,但Apache会自动侦测到此服务器已shutdown,后继的新请求将不会再引导到此节点。
对于负责请求分发的Apache服务器,需要消耗大量的CPU资源,因此如果在测试过程中出现一些Service Temporarily Unavailable或Server has shut down the connection prematurely这样的错误,这一般都是服务器配置不够好引起的,或者是Apache、Tomcat、及应用中的某些配置不够使用,这时候就要考虑换更好的机器或优化应用中的配置。
常见问题
一、cannot connect to server:无法连接到服务器。这种情况是服务器的配置有问题,服务器无法承受过多的并发连接了,需要优化服务器的配置:
如操作系统采用更高版本,如windows 2003 server,
优化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450"
但是tomcat 最多支持500个并发访问
优化apache配置:
ThreadsPerChild 1900
MaxRequestsPerChild 10000
二、 Action.c(10): Error -27791: Server has shut down the connection prematurely
HTTP Status-Code=503 (Service Temporarily Unavailable)
一般都是由于服务器配置不够好引起的,需要优化硬件和调整程序了。
三、无法处理请求:
当我们输入 ***.do 命令后,apache却返回错误信息,而连接tomcat却没有问题。原因是没有把.do命令转发给tomcat处理。解决方法如下:
在apache配置文件中配置如下内容:
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
tomcat port 8009 and ajp13 协议
Tomcat最主要的功能是提供Servlet/JSP容器,尽管它也可以作为独立的Java Web服务器,它在对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器,如IIS和Apache服务器。
因此在实际应用中,常常把Tomcat与其他HTTP服务器集成。对于不支持Servlet/JSP的HTTP服务器,可以通过Tomcat服务器来运行Servlet/JSP组件。
当Tomcat与其他HTTP服务器集成时,Tomcat服务器的工作模式通常为进程外的Servlet容器,Tomcat服务器与其他HTTP服务器之间通过专门的插件来通信。关于Tomcat服务器的工作模式的概念可以参考本书1.4节。
本章首先讨论Tomcat与HTTP服务器集成的一般原理,然后介绍Tomcat与Apache以及IIS集成的详细步骤。
22.1 Tomcat与HTTP服务器集成的原理
Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。默认情况下,Tomcat在server.xml中配置了两种连接器:
<!-- Define a non-SSL Coyote HTTP/1.1
Connector on port 8080 -->
<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
redirectPort="8443"
acceptCount="100"
debug="0"
connectionTimeout="20000"
disableUploadTimeout="true" />
<!-- Define a Coyote/JK2 AJP 1.3
Connector on port 8009 -->
<Connector port="8009"
enableLookups="false"
redirectPort="8443" debug="0"
protocol="AJP/1.3" />
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
Web客户访问Tomcat服务器上JSP组件的两种方式如图22-1所示。
图22-1 Web客户访问Tomcat服务器上的JSP组件的两种方式
在图22-1中,Web客户1直接访问Tomcat服务器上的JSP组件,他访问的URL为http://localhost:8080 /index.jsp。Web客户2通过HTTP服务器访问Tomcat服务器上的JSP组件。假定HTTP服务器使用的HTTP端口为默认的80端口, 那么Web客户2访问的URL为http://localhost:80/index.jsp 或者 http://localhost/index.jsp。
下面,介绍Tomcat与HTTP服务器之间是如何通信的。
22.1.1 JK插件
Tomcat提供了专门的JK插件来负责Tomcat和HTTP服务器的通信。应该把JK插件安置在对方的HTTP服务器上。当HTTP服务器接收到客 户请求时,它会通过JK插件来过滤URL,JK插件根据预先配置好的URL映射信息,决定是否要把客户请求转发给Tomcat服务器处理。
假定在预先配置好的URL映射信息中,所有"/*.jsp"形式的URL都由Tomcat服务器来处理,那么在图22-1的例子中,JK插件将把客户请 求转发给Tomcat服务器,Tomcat服务器于是运行index.jsp,然后把响应结果传给HTTP服务器,HTTP服务器再把响应结果传给Web 客户2。
对于不同的HTTP服务器,Tomcat提供了不同的JK插件的实现模块。本章将用到以下JK插件:
与Windows下的Apache HTTP服务器集成:mod_jk_2.0.46.dll
与Linux(RedHet)下的Apache HTTP服务器集成:mod_jk.so-ap2.0.46-rh72..46-rh72
与IIS服务器集成:isapi_redirect.dll
22.1.2 AJP协议
AJP是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。在配置Tomcat与HTTP服务器集成中,读者可以不必关心AJP协议的细节。关于AJP的知识也可以参考网址:
http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/doc/common/AJPv13.html
22.2 在Windows下Tomcat与Apache服务器集成
Apache HTTP服务器是Apache软件组织提供的开放源代码软件,它是一个非常优秀的专业的Web服务器,为网络管理员提供了丰富多彩的Web管理功能,包括 目录索引、目录别名、内容协商、可配置的HTTP错误报告、CGI程序的SetUID执行、子进程资源管理、服务器端图像映射、重写URL、URL拼写检 查以及联机手册等。
Apache HTTP服务器本身没有提供Servlet/JSP容器。因此,在实际应用中,把Tomcat与Apache集成,可以建立具有实用价值的商业化的Web 平台。在Windows NT/2000下Tomcat与Apache服务器集成需要准备的软件参见表22-1。
表22-1 在Windows NT/2000下Tomcat与Apache服务器集成需要准备的软件
1、安装Apache HTTP服务器
运行apache_2.0.47-win32-x86-no_ssl.msi,就启动了Apache HTTP服务器的安装程序,只要按默认设置进行安装即可。如果安装成功,会自动在Windows中加入Apache HTTP服务,如图22-2所示。
图22-2 加入到Windows服务中的Apache服务
假定Apache的根目录为,在其conf子目录下有一个配置文件httpd.conf。如果Apache安装在本机,并且采用默认的80端口作为HTTP端口,在httpd.conf文件中会看到如下属性:
Listen 80
ServerName localhost:80
在操作系统的【开始】→【程序】→【Apache HTTP Server 2.0.47】→【Control Apache Server】菜单中,提供了重启(Restart)、启动(Start)和关闭(Stop)Apache服务器的子菜单。
应该确保80端口没有被占用,否则Apache服务器无法启动。Apache服务器启动后,就可以通过访问Apache的测试页来确定是否安装成功。访问http://localhost,如果出现如图22-3所示的网页,就说明Apache已经安装成功了。
图22-3 Apache服务器的测试网页
2、在Apache中加入JK插件
在Apache中加入JK插件,只要把mod_jk_2.0.46.dll拷贝到/modules目录下即可。
3、创建workers.properties文件
workers.properties文件用于配置Tomcat的信息,它的存放位置为 /conf/workers.properties。在本书配套光盘的sourcecode/chapter22/windows_apache目录下提 供了workers.properties文件,它的内容如下("#"后面为注释信息):
workers.tomcat_home=C:\jakarta-tomcat
#让mod_jk模块知道Tomcat
workers.java_home=C:\j2sdk1.4.2
#让mod_jk模块知道j2sdk
ps=#指定文件路径分割符
worker.list=worker1
worker.worker1.port=8009
#工作端口,若没占用则不用修改
worker.worker1.host=localhost
#Tomcat服务器的地址
worker.worker1.type=ajp13
#类型
worker.worker1.lbfactor=1
#负载平衡因数
以上文件中的属性描述参见表22-2。
表22-2 workers.properties文件的属性
4、修改Apache的配置文件httpd.conf
打开/conf/httpd.conf文件,在其末尾加入以下内容:
# Using mod_jk2.dll to
redirect dynamic calls to Tomcat
LoadModule jk_module
modules\mod_jk_2.0.46.dll
JkWorkersFile
"conf\workers.properties"
JkLogFile "logs\mod_jk2.log"
JkLogLevel debug
JkMount /*.jsp worker1
JkMount /helloapp/* worker1
在本书配套光盘的sourcecode/chapter22/windows_apache/httpd_modify.conf文件中提供了以上内容,它指示Apache服务器加载JK插件,并且为JK插件设置相关属性,这些属性的描述参见表22-3。
表22-3 JK插件的相关属性
JkMount用来指定URL映射信息,"JkMount /*.jsp worker1"表示"/*.jsp"形式的URL都由worker1代表的Tomcat服务器来处理;"JkMount /helloapp/* worker1"表示访问helloapp应用的URL都由worker1来处理。
5、测试配置
重启 Tomcat服务器和Apache服务器,通过浏览器访问http://localhost/index.jsp,如果出现Tomcat的默认主页,说明 配置已经成功。此外,如果在Tomcat服务器上已经发布了helloapp应用,可以访问http://localhost/helloapp /index.htm,如果正常返回helloapp应用的index.htm网页,说明配置已经成功。
如果配置有误,可以查看JK插件生成的日志信息,它有助于查找错误原因。在Apache的配置文件httpd.conf中设定该日志文件的存放位置为/logs/mod_jk2.log
6、Apache与多个Tomcat服务器集成时的负载平衡
在实际应用中,如果网站的访问量非常大,为了提高访问速度,可以将多个Tomcat服务器与Apache集成,让它们共同分担运行 Servlet/JSP组件的任务。 JK插件的loadbalancer(负载平衡器)负责根据在workers.properties文件中预先配置的lbfactor(负载平衡因数)为 这些Tomcat服务器分配工作负荷,实现负载平衡。
假定Apache和两个Tomcat服务器集成,一个Tomcat服务器和Apache运行在同一台机器上,使用的JK端口为8
apache的http代理出现 502 Proxy Error
前不久刚部署好的网站,忽然访问报错提示错误引用
Http 502 Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /.
Reason: Error reading from remote server
看了半天也没看出个所以然来, 刚刚还好好的呢!过了一会网站又能打开了....
查看了一下apache的access_log。发现
引用.....Get / HTTP/1.0....这是ie5.5以下的版本访问过。所以又找来台ie5.5(挺难整,这年头这玩意少了!!)访问了一下,然后出错。在用别的机器访问错误还有。在刷新了一会又好了!
就这个问题Google了一下发现是mod_proxy的事,又G了一下他的文档
http://httpd.apache.org/docs/2.3/mod/mod_proxy.html
找到了这一段话引用For circumstances where mod_proxy is sending requests to an origin server that doesn't properly implement keepalives or HTTP/1.1, there are two environment variables that can force the request to use HTTP/1.0 with no keepalive. These are set via the SetEnv directive.
These are the force-proxy-request-1.0 and proxy-nokeepalive notes.译了一下大概是这意思(不是我译的)
引用当mod_proxy向一个没有正确实现持久连接(KeepAlive)或HTTP/1.1的原始服务器发送请求的时候,可以通过设置两个环境变量来发送不带持久连接(KeepAlive)的HTTP/1.0请求。这两个变量是通过SetEnv指令设置的。
以下是force-proxy-request-1.0和proxy-nokeepalive的例子:
- <Location /buggyappserver/>
- ProxyPass http://buggyappserver:7001/foo/
- SetEnv force-proxy-request-1.0 1
- SetEnv proxy-nokeepalive 1
- </Location>
最后在我的httpd.conf的VirtualHost里加上了上面的两行设置
- <VirtualHost *:80>
- JkMount /hr/servlet/* worker1
- JkMount /hr/*.jsp worker1
- JkMount /hr/*.do worker1
- ServerAdmin njgnini@163.com
- ServerName www.iteye.com
- ServerAlias www.iteye.com.cn
- RewriteEngine On
- RewriteRule ^/$ /hr/ [R,P]
- SetEnv force-proxy-request-1.0.1
- SetEnv proxy-nokeepalive 1
- </VirtualHost>
重启apache,在拿ie5.5访问O了
注意事项:
下载Apache Http Server步骤:
1.http://httpd.apache.org/download.cgi
2.页面右边单击2.4.7 (released 2013-11-25) (http://httpd.apache.org/download.cgi#apache24)
3。选择binaries/ (http://mirror.bit.edu.cn/apache//httpd/binaries/)
4。win32/ (http://mirror.bit.edu.cn/apache//httpd/binaries/win32/)
5。选择httpd-2.2.25-win32-x86-openssl-0.9.8y.msi 下载
下载mod_jk步骤:
1.http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
2.选择:windows/ (http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/)
3。选择tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip(注意与Apache Http版本对应,即2。2。X)下载
4。下载解压得到mod-Jk.so
httpd.conf文件,跑到文件最后面加入以下几行:
--//mod-Jk.so文件复制到Apache Http Server安装目录的modules下
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
JKWorkersFile conf/workers.properties --//\这个与httpd.conf同目录自已新建
JkLogFile logs/mod_jk.log
--//注意如果HTTP端口不是默认的80,即ServerName 127.0.0.1:9999
*后面需要修改成*:9999等
<VirtualHost *>
ServerAdmin localhost
----//DocumentRoot即webroot,即:发布目录,发布在这个目录下的任何工程都会在Apache服务开启时被装载成标准的web工程,我们现在动手来把这个WebRoot定位到我们自己的发布目录中去吧
DocumentRoot d:/www/
ServerName localhost
DirectoryIndex index.html index.htm index.jsp index.action
ErrorLog logs/shsc-error_log.txt
CustomLog logs/shsc-access_log.txt common
JkMount /*WEB-INF ajp13
JkMount /*j_spring_security_check ajp13
JkMount /*.action ajp13
JkMount /servlet/* ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
JkMount /*.action ajp13
JkMount /*fckeditor/editor/filemanager/connectors/*.* ajp13
JkMount /fckeditor/editor/filemanager/connectors/* ajp13
</VirtualHost>
Worker.properties文件内容如下:
workers.tomcat_home=d:/tomcat2
workers.java_home=C:/jdk1.6.32
ps=/
worker.list=ajp13 ---//这个与httpd.conf文件引用名要一样
//与TOMCAT中SERVER。XML中的AJP端口一致 <Connector port="8009" enableLookups="false" redirectPort="8443" bug="0" protocol="AJP/1.3" />
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13