Apache+JBoss配置多實例+負載均衡(mod_jk實現)

jopen 10年前發布 | 25K 次閱讀 JBoss 應用服務器

最近需要使用JBoss配置項目的負載均衡(最好能有多實例保證并發量),經過1整天的搜索和實踐,最終終于成功,在此記錄下來,以便他人和自己日后參考。

系統環境:
    Windows Server 2003
軟件環境:
    JDK 7 (Update 55)
    VC9 (http://www.microsoft.com/download/en/details.aspx?id=5582)
    Apache httpd 2.2.29 (http://www.apachelounge.com/download/additional/)
    JBoss-5.1.0.GA (http://jbossas.jboss.org/downloads)
    注意:盡量使用規定版本的程序,尤其是JBoss(版本差異太大),否則可能會出現未知的錯誤

一、安裝JDK及環境變量配置(略)
二、解壓httpd服務器(進行初始化即可)
    注意:該httpd解壓后,需要手動修改conf/httpd.conf配置文件中的部分內容(如:ServerName、DocumentRoot等)
三、解壓JBoss服務器(暫時不配置)
四、配置httpd服務器
    1、下載mod_jk.so模塊(http://tomcat.apache.org/download-connectors.cgi),使用對應httpd服務器的版本文件,本人這里使用的是mod_jk-1.2.31-httpd-2.2.3.so(http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/
    2、為httpd服務器添加mod_jk模塊,將mod_jk-1.2.31-httpd-2.2.3.so改名為mod_jk.so,放入modules文件夾下即可
    3、在conf文件夾下添加文件mod_jk.conf(主要是載入剛剛的mod_jk模塊,并做配置):

</div> </div>

    # Load mod_jk module

# Specify the filename of the mod_jk lib  
LoadModule jk_module modules/mod_jk.so  
# 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 indicates to send SSK KEY SIZE  
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories  
# JkRequestLogFormat  
JkRequestLogFormat "%w %V %T"  
# Mount your applications  
JkMount /application/* loadbalancer  
# You can use external file for mount points.  
# It will be checked for updates each 60 seconds.  
# The format of the file is: /url=worker  
# /examples/*=loadbalancer  
JkMountFile conf/uriworkermap.properties  
# Add shared memory.  
# This directive is present with 1.2.10 and  
# later versions of mod_jk, and is needed for  
# for load balancing to work properly  
JkShmFile logs/jk.shm  
# Add jkstatus for managing runtime data  
<Location /jkstatus/>  
    JkMount status  
    Order deny,allow  
    Deny from all  
    Allow from 127.0.0.1  
</Location>  </pre><span style="font-family:Courier New;font-size:12px;"><br />

    4、修改conf/httpd.conf,在最下方加入如下配置(意思即為引用mod_jk.conf設置文件):</span>

 
#JBoss conf  
Include conf/mod_jk.conf 

    5、在conf文件夾下增加uriworkermap.properties(負載均衡的訪問路徑配置,在mod_jk.conf提及):
  1. /*=loadbalancer  

    6、在conf文件夾下增加workers.properties(負載均衡的服務器節點配置,在mod_jk.conf提及):
        注意:worker.node1.port和worker.node2.port是服務器的ajp端口,這里兩個節點的端口相隔100,是因為后邊在JBoss設置中,多實例的端口偏移量設置了100。
    # Define list of workers that will be used for mapping requests
worker.list=loadbalancer,status

# Load-balancing behaviour  
worker.loadbalancer.type=lb  
worker.loadbalancer.balance_workers=node1,node2  
worker.loadbalancer.sticky_session=1  
# Status worker for managing load balancer  
worker.status.type=status  

# Node1  
worker.node1.port=8009  
worker.node1.host=127.0.0.1  
worker.node1.type=ajp13  
worker.node1.lbfactor=1  
worker.node1.cachesize=10  
# Node2  
worker.node2.port=8109  
worker.node2.host=127.0.0.1  
worker.node2.type=ajp13  
worker.node2.lbfactor=1  
worker.node2.cachesize=10  </pre><br />

五、配置多實例的JBoss服務器
    由于是多實例(多進程,不同端口),所以我們需要使用兩份一樣的部署應用,我們先將JBoss解壓后的server/all文件夾復制兩份,分別為server/node1文件夾和server/node2文件夾。
    兩個文件夾即為兩個實例啟動的部署應用,現在開始詳細的配置:
    1、node1與node2類似的配置:
        (1)修改server/node1(node2)/deploy/jbossweb.sar/server.xml配置文件:
            A、兩個${jboss.bind.address}均替換為${0.0.0.0}(出于安全性考慮,JBoss會綁定服務器IP,設置為0.0.0.0將解除這一綁定的限制)
            B、將node1中<Engine name="jboss.web" defaultHost="localhost">修改為<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">,node2做對應修改(表示不同的節點,節點名稱需要和httpd服務器配置 workers.properties文件中的節點名稱一致)
        (2)修改server/node1(node2)/deploy/messaging/messaging-service.xml配置文件:
            A、將node1中<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:0}</attribute& gt;的數值0修改為1,node2中對應位置修改為2(該數字表示集群時的id,不可重復)
        (3)修改server/node1(node2)/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml文件:
            A、將如下四段解除配置,并修改false為true,修改結果(用于session同步):

    <property name="useJK">true</property>  
    <property name="useSessionPassivation">true</property>  
    <property name="passivationMaxIdleTime">-1</property>    
    <property name="passivationMinIdleTime">-1</property>  

        (4)修改server/node1(node2)/conf/bootstrap/profile.xml配置文件(在parameter標簽處加入class="java.io.File",避免啟動時報錯):
    <bean name="AttachmentStore" class="org.jboss.system.server.profileservice.repository.AbstractAttachmentStore">  
        <constructor><parameter class="java.io.File"><inject bean="BootstrapProfileFactory" property="attachmentStoreRoot" /></parameter></constructor>  
        ...  
    </bean>  

    2、node2的不同配置:
        (1)修改server/node2/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml配置文件:
            A、JBoss啟動的端口設置偏移量,由0修改為100(這里就是httpd服務器中ajp端口間隔100的原因):
    <bean name="PortsDefaultBindings"  class="org.jboss.services.binding.impl.ServiceBindingSet">  
        <constructor>  
            ...  
            <parameter>100</parameter>  
            ...  
        </constructor>  
    </bean>  

六、項目中session同步說明:
    1、上述的JBoss已經提及了session的同步,并修改了war-deployers-jboss-beans.xml的配置;
    2、修改項目自身的配置(以server/node1(node2)/deploy/ROOT.war為例)
        (1)修改WEB-INF/web.xml文件,加入<distributable />(一定要注意順序,順序錯誤啟動會報錯的)
    <web-app>  
      <display-name>Welcome to JBoss</display-name>  
      <description>  
         Welcome to JBoss  
      </description>  
      <distributable />  
      <servlet>  
        <servlet-name>Status Servlet</servlet-name>  
        <servlet-class>org.jboss.web.tomcat.service.StatusServlet</servlet-class>  
      </servlet>  
      <servlet-mapping>  
        <servlet-name>Status Servlet</servlet-name>  
        <url-pattern>/status</url-pattern>  
      </servlet-mapping>  
    </web-app>  
</div>

    </div>
            (2)在WEB-INF文件夾下添加jboss-web.xml配置文件(JBoss的特殊配置,同web.xml一同加載)
        <!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">  
        <jboss-web>  
            <context-root>/</context-root>  
            <replication-config>  
                <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>  
                <replication-granularity>SESSION</replication-granularity>  
                <replication-field-batch-mode>True</replication-field-batch-mode>  
            </replication-config>  
        </jboss-web>  

    七、測試
        1、分別在server/node1(node2)/deploy/ROOT.war下添加test文件夾,放入測試jsp(附件有下載);
        2、啟動Apache httpd服務器(通過命令或制作Windows服務均可);
        3、啟動兩個JBoss實例:
            (1)在JBoss的bin文件夾下,添加兩個bat批處理(啟動設置好的node1和node2兩個JBoss實例):
                run-node1.bat,文件內容(右鍵用記事本編輯即可):
                    run.bat -c node1
                run-node2.bat,文件內容(右鍵用記事本編輯即可):
                    run.bat -c node2
            (2)依次雙擊即可啟動兩個JBoss實例(啟動較慢,需等待node1啟動后再啟動node2)
        4、訪問測試頁面:
            (1)啟動瀏覽器1,訪問http://localhost/test/index.jsp,截圖如下:
    20141010125106452.png
            (2)啟動瀏覽器2,訪問http://localhost/test/index.jsp,截圖如下:
    20141010125112380.png
            說明:通過sessionid即可看出進行了負載均衡
    八、附注
        1、由于每個瀏覽器每次的訪問只有一個session,而且每個瀏覽器每次session會話中,并未發現節點的變化,所以session的同步并未測試;
        2、上述中提及的很多配置都沒有詳細的說明(如conf設置和一個配置文件),如需要詳細解釋,請自行搜索。


    附件:
    test.zip
    來自:http://blog.csdn.net/tylanbin/article/details/39960411

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!