服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

dirtysea 发表于 2007-4-30 17:50:06

Apache+Tomcat集群配置负载均衡器

<UL>
<LI>tomcat是开源servlet \jsp服务器,下载地点 <A href="http://jakarta.apache.org/" target=_blank><FONT color=#5c81a7>http://jakarta.apache.org/</FONT></A> ;
<LI>apache 2.0.43 是开源的www服务器,下载地点 <A href="http://www.apache.org/dist/httpd/binaries/" target=_blank><FONT color=#5c81a7>http://www.apache.org/dist/httpd/binaries/</FONT></A> ;
<LI>JavaGroups是一个实现集群服务实体间通信的通信协议,下载地址: <A href="http://www.javagroups.com/" target=_blank><FONT color=#5c81a7>http://www.javagroups.com/</FONT></A> ;
<LI>Tomcat 会话复制库,基于JavaGroups通信协议,完成集群服务实体间任务执行上下文的复制,下载地址: <A href="http://www.filip.net/tomcat/tomcat-javagroups.jar" target=_blank><FONT color=#5c81a7>http://www.filip.net/tomcat/tomcat-javagroups.jar</FONT></A>
<LI>jk2模块,jk 是mod_jserv的替代者,它是Tomcat-Apache插件,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用。JK2是符合apache 2.x系列的新品,下载地址: <A href="http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/release/v2.0.2/bin/" target=_blank><FONT color=#5c81a7>http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/release/v2.0.2/bin/</FONT></A>。 </LI></UL>
<P><A name=N100F0><SPAN class=smalltitle><STRONG><FONT size=3>2.2 配置负载均衡器</FONT></STRONG></SPAN></A></P>
<P>在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers2.properties时不要忘了重新启动apache。 </P>
<UL>
<LI>第一步,安装和调试apache
<P>负载均衡器jk2模块是apache www 服务的插件,所以配置负载均衡器就得先安装apache。本文下载的是windows版本 2.0.43,执行setup.exe并回答一些简单问题就可完成apache的任务。值得注意的是,安装并启动apache后如果apache对http://localhost/ 地址没反应,你得修改apache安装路径下htdocs目录下的index.html.xx文件,比如把index.html.en改成index.html。</P>
<LI>第二步,安装jk2
<P>把下载到的 <A href="http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/release/v2.0.2/bin/win32/mod_jk2-2.0.43.dll" target=_blank><FONT color=#5c81a7>mod_jk2-2.0.43.dll</FONT></A>改成mod_jk2.dll 放到apache的modules目录下,修改apache的httpd.conf,即在LoadModule foo_module modules/mod_foo.so 行下插入mod_jk2模块的装载信息: </P>
<P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode># Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule jk2_module modules/mod_jk2.dll
</PRE></TD></TR></TBODY></TABLE><BR></P>
<LI>第三步,配置jk2
<P>jk2的配置全在一个配置文件中,文件名为workers2.properties,和apache 的httpd.conf放在同一个目录下。以下是这个文件的内容:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>#++++++++++++++++++++++++++++++++++++
# only at beginnin. In production uncomment it out

level=DEBUG
#shm必须配

file=D:\Program Files\Apache Group\Apache2\logs\shm.file
size=1048576
# 第一个tomcat 的地址
# Example socket channel, override port and host.

port=11009
host=127.0.0.1
# 定义第一个工作者指向第一个tomcat
# define the worker

channel=channel.socket:tomcat1
#第二个tomcat 得地址
# Example socket channel, override port and host.

port=12009
host=10.1.36.123
# 定义第二个工作者指向第二个tomcat
# define the worker

channel=channel.socket:tomcat2
#定义负载均衡器,使其包含两个工作者

worker=ajp13:tomcat2
worker=ajp13:tomcat1
#指定负载均衡器完成单一地址映射,使得apache 服务所在的uri全部指向 两个tomcat 上的 root
# Uri mapping

group=lb:lb1
#++++++++++++++++++++++++++++++++++++++++++
</PRE></TD></TR></TBODY></TABLE><BR></LI></UL>
<P>对于jk2模块的负载均衡配置可参见相关站点,值得提及的是jk2的负载均衡还支持权重分配等优秀功能。 </P>
<P><A name=N10120><SPAN class=smalltitle><STRONG><FONT size=3>2.3 配置tomcat</FONT></STRONG></SPAN></A></P>
<P>同属于一个集群下的两个服务实体,要求功能的同一性,所以我们可先安装和配置第一个tomcat,接着拷贝形成第二个tomcat,最后配置第二个tomcat。 </P>
<P><A name=N10129><SPAN class=smalltitle><STRONG><FONT size=3>2.3.1 安装第一个tomcat</FONT></STRONG></SPAN></A></P>
<P>安装tomcat 非常简单,本文就不再描述。我们假设第一个tomcat的安装路径为d:\tomcat1。 </P>
<P>拷贝tomcat-javagroups.jar和javagroups.jar到d:\tomcat1\ server\lib 路径下。</P>
<P><B>2.3.2 配置第一个tomcat</B> </P>
<P>2.3.2.1 配置jk2</P>
<P>tomcat 中的jk2 connector缺省端口为8009,为了在一台机器上运行两个tomcat,修改D:\Tomcat1\conf\jk2.properties,设置jk2 connector的端口为11009,整个文件内容如下: </P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>#++++++++++++++
channelSocket.port=11009
#++++++++++++++
</PRE></TD></TR></TBODY></TABLE><BR>
<P>2.3.2.2 修改server.conf</P>
<P>首先为了让一台机器上运行两个tomcat,修改server.conf的tomcat 停止指令监听端口:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt; 改为
&lt;Server port="11005" shutdown="SHUTDOWN" debug="0"&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>然后打开JK2 AJP connector ,关闭其它connector,下面是JK2 AJP 1.3的样子,这里已把它的端口改为11009:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>&lt;!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --&gt;
    &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
               port="11009" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="10" debug="0" connectionTimeout="20000"
               useURIValidationHack="false"
               protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>接着配置需要集群支持的webapp(比如examples) 的context,添加如下manager:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>    &lt;Manager
      className="org.apache.catalina.session.InMemoryReplicationManager"
      protocolStack="UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):PING(timeout=3000;
                num_initial_members=6):FD(timeout=5000):VERIFY_SUSPECT(timeout=1500):
                  pbcast.STABLE(desired_avg_gossip=10000):pbcast.NAKACK(gc_lag=10;
                retransmit_timeout=3000):UNICAST(timeout=5000;min_wait_time=2000):
                  MERGE2:FRAG:pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;
                shun=false;print_local_addr=false)"&gt;
      &lt;/Manager&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>注意protocolStack的值必须在一行内写完。</P>
<P><B>2.3.3 配置第二个tomcat</B> </P>
<P>我们先把已经配好的第一个tomcat复制一份,形成第二个tomcat,假设路径为d:\tomcat2。</P>
<P>2.3.3.1 配置jk2</P>
<P>修改D:\Tomcat2\conf\jk2.properties,设置jk2 connector的端口12009,整个文件内容如下:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>#++++++++++++++
channelSocket.port=12009
#++++++++++++++
</PRE></TD></TR></TBODY></TABLE><BR>
<P>2.3.3.2 修改server.conf</P>
<P>有了第一个tomcat的配置我们只需修改server.conf的tomcat 停止指令监听端口:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>&lt;Server port="11005" shutdown="SHUTDOWN" debug="0"&gt; 改为
&lt;Server port="12005" shutdown="SHUTDOWN" debug="0"&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>然后设置JK2 AJP connector 端口为12009。</P>
<P><A name=N10180><SPAN class=smalltitle><STRONG><FONT size=3>2.4 运行测试</FONT></STRONG></SPAN></A></P>
<P>启动apache,tomcat1和tomcat2。 </P>
<P><B>2.4.1 测试负载均衡</B> </P>
<P>我们先准备两个文件,第一个文件为test.jsp,拷贝到第一个tomcat 的根web应用的目录即d:\tomcat1\webapps\ROOT 下:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>&lt;html&gt;
&lt;body bgcolor="red"&gt;
&lt;center&gt;
&lt;%= request.getSession().getId() %&gt;
&lt;h1&gt;Tomcat 1&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>第二个文件也为test.jsp,拷贝到第二个tomcat 的根web应用的目录即d:\tomcat2\webapps\ROOT 下:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>&lt;html&gt;
&lt;body bgcolor="blue"&gt;
&lt;center&gt;
&lt;%= request.getSession().getId() %&gt;
&lt;h1&gt;Tomcat 2&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>从不同的浏览器中多次输入地址http://localhost/test.jsp 会看到不同的颜色,这表明apache中的jk2模块起到了负载均衡的作用。 </P>
<P><B>2.4.2 测试错误恢复</B> </P>
<P>访问url: http://localhost/examples/servlet/SessionExample 可以得到一个关于session的例子,我们用它来测试集群的错误恢复能力。 </P>
<P>测试步骤如下:</P>
<OL>
<LI>关闭tomcat1和tomcat2;
<LI>启动tomcat1
<LI>
<LI>在浏览器中输入属性名tomcat1和属性值tomcat1再提交,返回的页面显示session中有刚刚输入的tomcat1属性;
<LI>启动tomcat2;
<LI>过一会后(等待tomcat2和tomcat1通信并复制信息)关闭tomcat1;
<LI>在浏览器中输入属性名tomcat2和属性值tomcat2再提交,返回的页面显示session中有刚刚输入的tomcat2属性,还有先前输入的tomcat1属性;
<LI>启动tomcat1;
<LI>过一会后(等待tomcat2和tomcat1通信并复制信息)关闭tomcat2;
<LI>在浏览器中输入属性名tomcat11和属性值tomcat11再提交,返回的页面显示session中有刚刚输入的tomcat11属性,还有先前输入的tomcat1和tomcat2属性; </LI></OL>
<P>……</P>
<P><B>2.4.3 测试多目传输的方法</B> </P>
<P>如果运行测试失败,可以使用下面的JAVAGROUP方法测试机器的多目传输性:</P>
<P>启动多目接收器:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>java org.javagroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555
</PRE></TD></TR></TBODY></TABLE><BR>
<P>启动多目传输器:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>java org.javagroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555
</PRE></TD></TR></TBODY></TABLE><BR>
<P>这样你在McastSenderTest窗口中输入内容,应该在McastReceiverWindow中可以看到结果。如果看不到结果,在McastSenderTest运行参数中加入-ttl 32,如果还不行,可以修改多目地址再试试(注意避开系统保留用的多目地址);如果还不行,就去问问网管吧! </P>
<P><B>2.4.4 对tomcat-javagroups的修改</B> </P>
<P>tomcat-javagroups.jar中的org.apache.catalina.session.ReplicatedSession类的removeAttribute方法会导致stackoverflow错误,请按下面的代码对其进行修改: </P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>public void removeAttribute(String name, boolean notify, boolean jgnotify) {
      super.removeAttribute(name);
      if ( jgnotify )
      {
            SessionMessage msg =
                new SessionMessage(notify?SessionMessage.
                EVT_ATTRIBUTE_REMOVED_WNOTIFY:SessionMessage.
                EVT_ATTRIBUTE_REMOVED_WONOTIFY,
                                                            null,
                                                            getId(),
                                                            name,
                                                            null,
                                                            null);
            sendMessage(msg);
      }
      
    }
   public void removeAttribute(String name, boolean notify) {
      removeAttribute(name,notify,true);
}
</PRE></TD></TR></TBODY></TABLE><BR>

hanyi058 发表于 2006-5-23 19:16:14

re:Apache+Tomcat集群配置负载均衡器

羡慕!~
页: [1]
查看完整版本: Apache+Tomcat集群配置负载均衡器