JBoss启动时默认发布的不同的服务需要开放一些端口,如果只是简单地拷贝两套JBoss或者在一个JBoss中启动多个server配置的话,会由于端口冲突而导致JBoss无法启动。
这时候我们肯定会想到手动去修改这些发生冲突的端口,可是Jboss需要修改的端口实在是太多,如下:
1. $JBoss_home/server/default/deploy/ejb3.deployer/META-INF/jboss-service.xml 修改3873端口的值;
2. $JBoss_home/server/default/deploy/jboss-web.deployer/server.xml 修改8080,8009,8443端口值。
3. $JBoss_home/server/default/conf/jboss-service.xml 修改8083,1098,1099,4444,4445,4446端口值
4. $JBoss_home/server/default/conf/jboss-minimal.xml 修改1099端口值,与3中保持一致。
5. $JBoss_home/server/default/deploy/jms/uil2-service.xml 修改8093端口值。
不过幸运的是JBoss提供了另外一种简便的方法:Binding Manager服务,不需要繁琐的端口配置就可以实现多实例(多个server)运行端口不冲突,详细步骤如下:
以JBoss 4.2.3 GA为例,假设server下有两个不同的配置node1、node2(名字无所谓,default1、default1也行),%JBOSS_HOME%表示JBoss安装目录。
关键文件是%JBOSS_HOME%/docs/examples/binding-manager/sample-bindings.xml,该文件默认情况下 定义了4组不同的端口配置(port-default、port-01、port-02、port-03),也就是说默认情况下支持同一台机器部署4个JBoss实例。
1、node2配置如下
修改node2/conf/jboss-service.xml文件,配置Service Binding(默认注释掉)如下:
<mbean code="org.jboss.services.binding.ServiceBindingManager" name="jboss.system:service=ServiceBindingManager"> <attribute name="ServerName">ports-01</attribute> <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute> <attribute name="StoreFactoryClassName"> org.jboss.services.binding.XMLServicesStoreFactory </attribute> </mbean
这里配置node2使用的是port-01端口配置。
2、node1配置如下
node1默认可以不用配置,正常启动即可,这种情况下使用的是JBoss提供的默认端口8080、8009等,也可以参照第一步的配置,只需修改“ServerName”与node1不一样即可,如ports-02,注意只能是在sample-bindings.xml中定义的四组端口范围内
4、访问地址
node1访问地址: http://192.168.10.100:8080 (默认不配置的情况)或者 http://192.168.10.100:8280 (使用port-02的情况)
node2访问地址: http://192.168.10.100:8180 (使用port-01的情况)
大家也许注意到端口的规律,默认情况下是8080,其它实例的端口依次在8080的基础上增大100,对应 关系如下:
port-default 8080 port-01 8180 port-02 8280 port-03 8380
当然其他端口如AJP协议端口8009也分别变成8109、8209、8309、8409,其它以此类推
5、注意事项
1)上述配置的前提是每个实例的server.xml中HTTP协议的端口配置均为默认的8080,若该端口修改过,则需要修改sample-bindings.xml中port-default中的默认8080端口为server.xml中HTTP协议端口。
2)上述方法也同样适用于同一台机器上面部署多个JBoss的情况而不是同一个JBoss下多个配置。
3)一般情况下默认的4组端口足够使用,若仍不够,可自行添加其他port组。
4)若可能,仍是推荐不用的实例绑定到不同的IP地址上。
PS.
同一机器多JBoss实例常用场景:
1)32位JVM限制无法使用超过2G的内存,通过多实例可以充分利用
服务器上大内存。
2)不用JBoss实例用于不同用途:开发环境、测试环境等。
3)希望在同一个机器上部署不同版本的JBoss。
4)希望在同一个机器上部署基于不同JVM的JBoss(不同应用对JVM要求不一样的情况)。
一开始以为这个方法,只能应用于一个Jboss下配置多个server。测试发现,当时用两个Jboss时,用这种方法也是可以的。所以Jboss还是很人性化的。