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