Apache+JBoss配置多实例+负载均衡(mod_jk实现)

jopen 10年前

最近需要使用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>  

    4、修改conf/httpd.conf,在最下方加入如下配置(意思即为引用mod_jk.conf设置文件):
 
#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  

五、配置多实例的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