欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Apache2(.2)+tomcat+JK 集群

程序员文章站 2022-06-07 08:37:32
...
看了不少关于配置apache+tomcat集群的文章,按部就班的做,基本上能成功。可是软件的更新很快,一些老的配置已经不能满足需求,而一些新的配置也不能尽如人意,结合网上的实例,下面将我配置的过程做一个描述:

1 为什么要做集群?

集群有别于分布式的解决方案,它采用的是每台服务器运行相同应用的策略,由负责平衡的服务器进行分流,这对提高整个系统的并发量及吞吐量是更有效的办法。而集群对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群),状态复制需要在各服务器间复制应用状态,而负载平衡则不用,每台服务器都是独立的。实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。
    2 集群与负载平衡的区别

因为是以Apache + Tomcat+ JK 的负载平衡配置作为介绍,下面重点了解就JK的工作方式

使用mod_jk默认的以轮循方式进行平衡负载,假设有四个服务器节点,有10个请求,则四个节点分别接受请求编号如下:

节点A 节点B 节点C 节点D
1 2 3 4
5 6 7 8
9 10    

而集群方式也是使用这种方法进行平衡。Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。

集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。

但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的Session信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。

具体采用负载平衡还是集群,这要看应用的需求了。

3 软件下载

Tomcat: http://archive.apache.org/dist/tomcat/我使用的是tomcat-5;
Apache: http://archive.apache.org/dist/httpd/ 一般使用Apache2.2的版本
JK:mod_jk-1.2.x-httpd-2.2.x.so。jk是mod_jserv的替代者,它是Tomcat-Apache插件,为Apache和Tomcat的连接器,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用,当前的最新版本为1.2.26,不过不同JK版本与不同的Apache版本之间的搭配有一些差异,有的甚至配不起来。JK2是符合apache2.x系列的新品,但由于其配置太过麻烦,使用的人很少,很久以前已停止开发,所以我们采用了jk连接器,下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries
    值得注意的是:jk的版本最好和当前的Apache匹配。

说了这么多了,可能下面才是大家要关注的重点。

4 配置Apache

4.1 为了简便 ,可以下载Apache的安装文件,安装很简单,一路Next
4.2 安装完毕后,将下载的mod_jk-1.2.x-httpd-2.2.x.so复制到Apache安装目录下的modules子目录中。
      关于Apache的配置文件,可以在网上查看下子资料,如设置DocumentRoot(部署根目录),Listen(监听端口)等等,这里不再赘述。

4.3 然后进入Apache安装目录下的conf子目录中,打开httpd.conf配置文件,在最后插入以下一行:

          Include conf/mod_jk.conf 

        这样便于管理和修改配置文件。

4.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.x-httpd-2.2.x.so(x表示版本号)

    # Where to find workers.properties

   JkWorkersFile conf/workers.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

    JkMount /jkstatus status



    !/*.gif      loadbalancer

    !/*.jpg     loadbalancer

    !/*.png    loadbalancer

    !/*.css     loadbalancer

    !/*.js       loadbalancer

    !/*.htm    loadbalancer

    !/*.html   loadbalancer

    #关掉主机Lookup,如果为on,很影响性能,可以有10多秒钟的延迟。
    HostnameLookups Off

注:1、 蓝色加粗的两行是重点,第一句是Apache加载JK模块用的;第二句为配置哪些URL请求将由负载平衡器来处理。

     2、/* 匹配所有的请求,都由 loadbalancer 这个 worker 进行处理,但是有几个例外,/jkstatus 请求由 status 这个 worker 处理。另外这个配置中每一行数据前面的感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。

4.5  在conf子目录下,建立一个新的配置文件:workers.properties,此文件为负载平衡的配置文件,文件名不能修改,这是JK默认的名字,内容如下:
worker.list=loadbalancer

# Define the first node...

worker.worker1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009

worker.worker1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址

worker.worker1.type=ajp13

worker.worker1.lbfactor=1

worker.worker1.local_worker=1

worker.worker1.cachesize=1000

worker.worker1.cache_timeout=600

worker.worker1.socket_keepalive=1

worker.worker1.socket_timeout=0

worker.worker1.reclycle_timeout=300

worker.worker1.retries=3

# Define the second node...

worker.worker2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009,其他                                        主机可以用默认的端口

worker.worker2..host=localhost

worker.worker2..type=ajp13

worker.worker2..lbfactor=1

worker.worker2..local_worker=1

worker.worker2..cachesize=1000

worker.worker2..cache_timeout=600

worker.worker2..socket_keepalive=1

worker.worker2..socket_timeout=0

worker.worker2..reclycle_timeout=300

worker.worker2..retries=3

# Now we define the load-balancing behaviour

worker.loadbalancer.type=lb

worker.retries=3

worker.loadbalancer.balance_workers=worker1,worker2

worker.loadbalancer.sticky_session=true

worker.loadbalancer.sticky_session_force=true


注:以上定义了两个worker,一个为worker1,另一个为worker2,定义了一个负载平衡服务器loadbalancer,其中标蓝色的为重点配置项,相关的详细说明可以看官方的网站文档:http://tomcat.apache.org/connectors-doc/,其它节点的定义可以直接Copy,修改一下节点名及IP就好了。
A、worker.list=loadbalancer

设定工作的负载平衡器,各Tomcat节点不能加入此列表。

      B、worker.worker1.lbfactor

负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为1:1,则为平均分配。

C、worker.loadbalancer.balance_workers=worker1,worker2

   指定此负载平衡器负责的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异常。

4.6、Apache服务器的配置文件httpd.conf中,默认有三个参数对性能的影响比较大,但根据不同的性能要求,参数的表现又不一样,太小并发提不上去,太大性能反而不好,建议根据项目的需要,实际做个测试,如并发要求800的话,可以设定为:
    #一个连接的最大请求数量

    MaxKeepAliveRequests 1000(值为0,则不限制数量)

    #每个进程的线程数,最大1920。NT只启动父子两个进程,不能设置启动多个进程

    ThreadsPerChild    1000(最大为1920)

    #每个子进程能够处理的最大请求数

    MaxRequestsPerChild   1000(值为0,则不限制数量)

    这三个参数要根据不同的需求,不同的服务器进行调整。

5 测试
         我搭建的两个worker分别是 worker1和worker2,所用的端口分别是8009和9009,下面在同    一台电脑里测试loadbalance是否成功(host=localhost)。

         在进行以上实验时,两个Tomcat服务器都在同一台机器上运行,应该确保它们没有使用相同的端        口。在Tomcat的默认的server,xml中,一共配置了以下3个端口:
        <Server port="8005" shutdown="SHUTDOWN" debug="0">
        <Connector port="8080"/>
        <Connector port="8009"/>
       两个Tomcat服务器都在同一台机器上运行,则至少应该对其中一个Tomcat服务器的以上3个端口号    都进行修改。
        此外,如果把Tomcat和其他HTTP服务器集成,Tomcat主要负责处理HTTP服务器转发过来的客户请求,通过不会直接接受HTTP请求。因此为了提高Tomcat的运行性能,可以关闭Tomcat的HTTP连接器,方法为在server.xml中把Tomcat的HTTPConnector的配置注释掉。

        如果是接不同电脑上的tomcat,修改两个Tomcat服务器的JK端口,确保它们和workers.properties文件中的配置对应。此外,在使用了loadbalancer后,要求worker的名字和Tomcat的server.xml文件中的<Engine>元素的jvmRoute属性一致。

      Tomcat 服务器1:
      <Engine name="Catalina" defaultHost="localhost" debug="0" jmvRoute="worker1">
      Tomcat 服务器2:
      <Engine name="Catalina" defaultHost="localhost" debug="0" jmvRoute="worker2">

         6 测试

        至此,整个配置全部完成。

      编写测试文件:建立一个目录test,里面新建一个test.jsp,内容为     <%System.out.println("===========================");%>

        把test放到tomcat1,tomcat2的webapps下。在完成以上步骤后,分别启动两个Tomcat服务器和        Apache服务器,然后访问 http"//localhost/test/test.jsp,通过 http://localhost/test/test.jsp     访问,查看tomcat1的窗口,可以看到打印了一行"=========="再刷新一次,tomcat2也打印了    一条,再刷新,可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡。

        由于此时由 localbalancer来调度Tomcat服务器,因此不能断定到底访问的是哪个Tomcat服务器的     index.jsp,这对于Web客户来说是透明的。

  对于负责请求分发的Apache服务器,需要消耗大量的    CPU资源,因此如果在测试过程中出现一些    Service Temporarily Unavailable或erver  has shut down the connection prematurely这样的错    误,这一般都是服务器配置不够好引起的,或者是Apache、Tomcat、及应用中的某些配置不够使        用,这时候就要考虑换更好的机器或优化应用中的配置。

7 常见问题

一、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

转载至 http://telexiang.blogbus.com/logs/22529232.html