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

最近需要使用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模块,并做配置):
# 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提及):
/*=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>的数值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>

(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,截图如下:
Apache+JBoss配置多实例+负载均衡(mod_jk实现)_第1张图片
(2)启动浏览器2,访问http://localhost/test/index.jsp,截图如下:
Apache+JBoss配置多实例+负载均衡(mod_jk实现)_第2张图片
说明:通过sessionid即可看出进行了负载均衡
八、附注
1、由于每个浏览器每次的访问只有一个session,而且每个浏览器每次session会话中,并未发现节点的变化,所以session的同步并未测试;
2、上述中提及的很多配置都没有详细的说明(如conf设置和一个配置文件),如需要详细解释,请自行搜索。


附件:
test.zip

你可能感兴趣的:(apache)