Apache + Tomcat + JK 集羣

原文請見http://www.cnblogs.com/dennisit/p/3370220.html
php

本文介紹了集羣和負載均衡的基本開源實現,實現了用Apache分發請求到多個Tomcat裏面相應的應用。html

模塊介紹

- Apache做爲Webserver。用於處理靜態Http請求;java

- Tomcat做爲應用server(Servlet容器),處理動態請求;node

- JK 做爲Apache與Tomcat之間的橋樑,實現了Apache與Tomcat一對多的相應。使後端Tomcat負載均衡。web

開發環境

- Windows 7操做系統apache

- Java SE8後端

- Apache 2.2.14    (本地安裝路徑:D:\Apache2.2\)tomcat

- Tomcat 7.0.42  ( http://tomcat.apache.org/download-70.cgi ),假設在同一臺機器上模擬,下載zip版本號. 實例中展現了2個節點服務器

- mod_jk: 1.2.37:  ( http://tomcat.apache.org/download-connectors.cgi )session


安裝步驟:


1.安裝jdk
2.安裝Apache2.2,使用默認設置,並且安裝路徑中不要空格.
3.解壓tomcat
4.拷貝mod_jk.so到Apache安裝路徑的modules目錄下


配置步驟

改動Apache配置:

關於改動涉及到的文件httpd.confworkers.properties文件可以下載一份mod_jk的源代碼包參看

1.改動Apache配置文件httpd.conf(筆者路徑:D:\Apache2.2\conf\httpd.conf), 在最後一行末尾加入:

include "D:\Apache2.2\conf\mod_jk.conf"

2. 在httpd.conf 同文件夾下新建mod_jk.conf文件

#載入mod_jk Module 
LoadModule jk_module modules/mod_jk.so

#指定 workers.properties文件路徑
JkWorkersFile conf/workers.properties

#指定哪些請求交給tomcat處理,"controller"爲在workers.propertise裏指定的負載分配控制器名
JkMount /* controller

3.在httpd.conf同文件夾下新建 workers.properties文件

#這裏可以配置隨意多個Tomcat。此處配置了2個Tomat服務器.
#host和port依據本身實際配置.實例配置的是本機兩個tomcat,分別使用不一樣的port.避免衝突
#假設Tomcat再也不同一機器上。不是必需改port的。

#server 列表 worker.list=controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=9988 #ajp13 port號,在tomcat下server.xml配置,默認8009 worker.tomcat1.host=localhost #tomcat的主機地址。如不爲本機。請填寫ip地址 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 #server的加權比重,值越高,分得的請求越多 #========tomcat2======== worker.tomcat2.port=9999 #ajp13 port號,在tomcat下server.xml配置,默認8009 worker.tomcat2.host=localhost #tomcat的主機地址。如不爲本機。請填寫ip地址 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=1 #server的加權比重,值越高,分得的請求越多 #========controller,負載均衡控制器======== worker.controller.type=lb #指定此負載平衡器負責的Tomcat應用節點。 worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat #此處指定集羣是否需要會話複製,假設設爲true,則代表爲會話粘性,不進行會話複製。當某用戶的請求第一次分發到哪臺 #Tomcat後,後繼的請求會一直分發到此Tomcat服務器上處理。假設設爲false,則代表需求會話複製。 worker.controller.sticky_session=false #設爲false,則代表需求會話複製。


改動Tomcat配置:
說明,假設改動了tomcat配置文件,最好將文件編碼轉換成utf-8格式.
因爲實例中咱們定義了2tomcat處理分發.因此咱們將tomcat的解壓版本號(zip)格式複製一份.用來分別擔當不一樣的分發處理角色這裏因爲在一臺機器上,因此咱們使用zip版本號的,固然你某個分發處理機器上僅僅一個tomcatserver的話,可以選擇安裝版本號的.這裏推薦使用解壓版的.tomcat6的配置方式跟7一致.

tomcat-node1爲實例

1.改動分發tomcat相應的service.xml文件,保證Apache相應的 workers.properties中的AJP13connectorport.
 <!-- 定義一個AJP 1.3 鏈接port爲9988 ,默認值爲8009,這裏咱們改爲咱們自定義的9988port -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

2.添加jvmRoute的值,保證同workers.properties裏邊配置的值一致

    <!--添加jvmRoute,值爲在Apache中配置的list集羣結點中的值,這裏定義爲tomcat1結點-->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

3.去掉默認凝視掉的集羣配置

  <!--取消集羣結點相關的凝視,該句默認值凝視掉的,咱們需要配置集羣因此去掉凝視,讓其起做用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

假設咱們的tomcat結點分佈在不一樣的機器上,那麼咱們的集羣至此已經配置完畢.去掉多餘凝視,顯示作了改動的部位

改動前

<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

    <!--For clustering-->
    <!--
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    -->

改動後的tomcat-node1


<!-- 定義一個AJP 1.3 鏈接port爲9988 ,默認值爲8009,這裏咱們改爲咱們自定義的9988port -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

    <!--添加jvmRoute,值爲在Apache中配置的list集羣結點中的值,這裏定義爲tomcat1結點-->
    <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat1">

    <!--取消集羣結點相關的凝視,該句默認值凝視掉的,咱們需要配置集羣因此去掉凝視,讓其起做用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

改動後的tomcat-node2


<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9999" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat2">

    <!--For clustering-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

說明:這裏的protocol="AJP/1.3",鏈接以及jvmRoute需要保證同咱們在Apacheserver中配置的works.properties一致.改動完後最好將service.xml文件的編碼設置爲utf-8格式.不然可能tomcat啓動會出錯.


4.實例中咱們的兩個tomcat結點在同一臺機器上,因此還需要保證protocol="HTTP/1.1"的port不一致.否則本地的兩個tomcat會起衝突

如下爲筆者實例中解決同一臺機器上多個tomcatserver之間port衝突作的改動.

Tomcat--node1

Tomcat-node2

<Server port="9995" shutdown="SHUTDOWN">
……
 <Connector port="9990" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
……


說明:這裏的protocol="HTTP/1.1"配置的相關port之間不能衝突,而且也不能同本機其餘應用程序佔用的port衝突.不然可能會報錯.

實例測試

1.在web.xml文件裏添加

<distributable/>


2.編寫測試jsp代碼

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Tomcat集羣測試</title>
  </head>
  
  <body>
        server信息:

    <%
      String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
      System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm);
      out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); 
    %>
    
    session分發:
    <%
        session.setAttribute("name","dennisit");
        System.out.println("[session分發] session id:"+session.getId());
        out.println("<br>[session分發] session id: " + session.getId()+"<br>");
    %>
  </body>
</html>

3.測試負載均衡與session分發

將項目部署到每個集羣結點中,即實例中的tomcat_node1tomcat_node2,依次移動Apachetomcatserver,tomcatserver之間的啓動順序任意.這裏Apacheport使用默認的80.


上面是在FireFox中執行項目後刷新3次執行的效果,可以看到2tomcat分發結點之間輪流負載.而且兩臺server上的session值是同樣的.說明session分發成功.

附錄:

ApacheTomcat的差異:
Apache是一個webserver環境程序。可以做爲webserver使用。只是僅僅支持靜態網頁,如(asp,php,cgi,jsp)等動態網頁的就顯得無能爲力。


假設想讓server也能處理動態頁面,那麼就需要Tomcat

當處理靜態頁面時,Tomcat不如Apache迅速。Tomcat不象Apache同樣可配置(如:可以做爲一個代理server,即loadbalaner)

Tomcat不象Apache同樣強壯。

基於以上緣由,一個現實的站點使用一個Apache做爲Webserver,爲站點的靜態頁面請求提供服務。並使用Tomcatserver做爲一個Servlet/JSP插件,顯示站點的動態頁面。

 

Apache,Tomcat負載均衡和集羣

對請求的處理又有兩種不一樣的方式:負載平衡、狀態複製(即集羣).
負載平衡:每臺server都是獨立的,僅僅是對請求的負載進行平衡,而不正確狀態(SESSION)進行復制。
狀態複製(集羣):先進行負載平衡,再在各server間複製應用狀態。

 

Apache+Tomcat構建企業級應用

1.Apache主要用來解析靜態文本,htmltomcat也有此功能。但apache能大大提升效率,對於併發數較大的企業級應用,能更好的顯示Apache的高效率;  
2.Tomcat 用來解析jsp,servlet,所有的客戶請求首先會發送到apache,假設請求是靜態文本則由apache解析,並把結果返回給 client,假設是動態的請求。如jspapache會把解析工做交給tomcat,由tomcat進行解析(這首先要二者現實整合),tomcat解析完 成後。結果還是經過apache返回給client,這樣就可以達到分工合做,實現負載均衡。提升系統的性能!

相關文章
相關標籤/搜索