Eclipse Java EE+Tomcat问题和Apache整合Tomcat

来源:互联网 发布:好易网络电视apk下载 编辑:程序博客网 时间:2024/06/14 11:33

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
对内IP:10.225.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端口

2.2 App Server的安装

直接解压tomcat至你的本地如:d:\tomcat,我这边用的目录名叫tomcat2,大家随意,最好名字能够越简单越好d:\tomcat或者c:\tomcat就行,不要放得太“深”。

2.3 Web Server的安装

我们在这边将安装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 的连接方式。

    参考资料

   获得     Apache Http Server

  •    获得  Apache Tomcat     JK 文档

    关于作者刘冬,一直使用 J2EE/J2ME 从事移动互联网方面的开发。您可以通过 Java 自由人网站来跟他联系,网址是:

    http://www.dlog.cn/javayou

     ,另外他的邮件地址是

    [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服务器集成需要准备的软件
   Tomcat开发技术之与HTTP服务器的集成(图二) 
  1、安装Apache HTTP服务器
  
  运行apache_2.0.47-win32-x86-no_ssl.msi,就启动了Apache HTTP服务器的安装程序,只要按默认设置进行安装即可。如果安装成功,会自动在Windows中加入Apache HTTP服务,如图22-2所示。
   Tomcat开发技术之与HTTP服务器的集成(图三)
  图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已经安装成功了。
   Tomcat开发技术之与HTTP服务器的集成(图四)
  图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的例子:

  1. <Location /buggyappserver/>  
  2.   ProxyPass http://buggyappserver:7001/foo/  
  3.   SetEnv force-proxy-request-1.0 1  
  4.   SetEnv proxy-nokeepalive 1  
  5. </Location>   

最后在我的httpd.conf的VirtualHost里加上了上面的两行设置
  1. <VirtualHost *:80>   
  2.    JkMount /hr/servlet/* worker1   
  3.    JkMount /hr/*.jsp worker1   
  4.    JkMount /hr/*.do worker1   
  5.    ServerAdmin njgnini@163.com   
  6.    ServerName www.iteye.com   
  7.    ServerAlias www.iteye.com.cn   
  8.    RewriteEngine On   
  9.    RewriteRule ^/$ /hr/ [R,P]         
  10.      
  11.    SetEnv force-proxy-request-1.0.1   
  12.    SetEnv proxy-nokeepalive 1   
  13. </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

 

原创粉丝点击