renheshi 发表于 2017-1-10 08:47:25

自己搭建的apache+jboss集群-步步为营

  这几天应公司的要求,要把所有的服务器换成linux的,要求搭建个apache+2个JBOSS集群实现负载均衡的要求,之前对linux也不是特别的熟悉,参考了很多资料,反复的实验,终于把环境搭建成功了,测试通过。这里把我搭建的详细步骤共享给大家看看,希望对想学习的人有帮助。这里只做到实现功能,没有写出优化的地方。好了,开始吧:
  
  配置环境:APACHE+JBOSS+JBOSS
  其中apche跟其中一个jboss在同一个服务器上,IP为192.168.1.95
  另外一个jboss部署在192.168.1.198服务器上
  系统均为linux-redhat5
  基本配置
  1·配置静态IP
  vi /etc/sysconfig/network-script/ifcfg-eth0
  修改、添加内容如下:
  #设置为静态IP
  BOOTPROTO=static
  #设置IP地址、掩码、网关
  IPADDR=192.168.1.95
  NETMASK=255.255.255.0
  GATEWAY=192.168.1.1
  2·配置DNS
  vi /etc/resolv.conf
  #修改DNS地址
  nameserver 202.101.103.55
  nameserver 218.85.157.99
  3·重启网络
  service network restart
  4·设置启动级别
  vi /etc/inittab
  修改id:5:initdefault为id:3:initdefault
  
  Apache、jboss、jdk、apache-tomcat连接文件的安装
  
  1·安装httpd-2.2.12.tar.gz
  tar –zxvf httpd-2.2.12.tar.gz
  cd httpd-2.2.12
  ./configure --prefix=/usr/local/apache --enable-so --enable-vhost-alias --enable-rewrite --enable-deflate --enable-mods-shared=all --with-mpm=worker
  make
  make install
  测试安装是否成功
  # 启动apache
  /usr/local/apache/bin/apachectl start
  打开http://127.0.0.1开看看能否打开
  
  2·安装jdk-6u1-linux-i586.bin
  chmod 777 ./ jdk-6u1-linux-i586.bin
  #验证是否出错
  echo $?
  0代表正确
  cp–a jdk1.6.0_01 /usr/local/ jdk1.6.0_01
  #配置环境变量
  vi /etc/profile
  
  export JAVA_HOME=/usr/local/jdk1.6.0_01
  export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/dt.jar
  export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin:$JAVA_HOME/jre/bin
  
  #使变量立即生效
  source /etc/profile
  #测试配置是否成功
  java –version
  会显示JDK的版本号
  
  3·安装Jboss4.2.2
  unzip jboss4.2.2.GA.zip
  cp –a jboss4.2.2.GA /usr/local/
  #JBOSS默认只能本机访问,修改server.xml使它支持所有网络访问
  vi $jboss/server/default/deploy/jboss-web.deployer/server.xml ($jboss表示你jboss的目录,下同)
  修改
  <Connector port="8080" address="${jboss.bind.address}"
  为
  <Connector port="8080" address="0.0.0.0">
  修改
  <Connector port="8009" address="${jboss.bind.address}" protocol="AJP/1.3"
  为
  <Connector port="8009" address="0.0.0.0" protocol="AJP/1.3"
  #启动测试jboss
  /$boss/bin/run.sh
  #打开IE测试
  http://127.0.0.1:8080
  
  
  4·安装Apache-tomcat-connectors-1.2.28-src.tar.gz
  tar –zxvf Apache-tomcat-connectors-1.2.28-src.tar.gz
  cd Apache-tomcat-connectors-1.2.28-src/native/
  #编译安装
  ./configure --with-apxs=/usr/local/apache/bin/apxs --with-java-home=/usr/local/jdk1.6.0_01 --with-java-platform=2 --enable-jni
  #验证是否成功
  echo $?
  make
  echo $?
  cp –a apache-2.0/mod_jk.so /usr/local/apache/modules/
  cd /usr/local/apache/modules/
  chmod 755 mod_jk.so
  
  
  配置整合
  
  1.修改$apache/conf/httpd.conf 在文件末尾添加: Include conf/mod_jk.conf
  2.在$apache/conf下新建文件 mod_jk.conf 文件内容如下:
  # Load mod_jk module. Specify the filename
  # of the mod_jk lib you’ve downloaded and
  # installed in the previous section
  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
  JkLogLevel info
  # Select the log format
  JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
  # JkOptions indicate to send SSL KEY SIZE,
  JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
  # JkRequestLogFormat set the request format
  JkRequestLogFormat "%w %V %T"
  JkMount /* loadbalancer
  其中JkMount /* loadbalancer的意思是,把所有的请求都发给loadbalancer处理。可以通过修改url来控制发送某些request。
  3、在$apache/conf下新建文件 workers.properties 其内容为:
  worker.list=loadbalancer,node1,node2
  # Define the first node...
  worker.node1.port=8009
  worker.node1.host=192.168.1.95
  worker.node1.type=ajp13
  worker.node1.lbfactor=1
  worker.node1.local_worker=1
  worker.node1.cachesize=10
  worker.node1.cache_timeout=600
  worker.node1.reply_timeout=100
  worker.node1.socket_timeout=300
  # Define the second node...
  worker.node2.port=8009
  worker.node2.host=192.168.1.198
  worker.node2.type=ajp13
  worker.node2.lbfactor=1
  worker.node2.local_worker=1
  worker.node2.cachesize=10
  worker.node2.cache_timeout=600
  worker.node2.reply_timeout=100
  worker.node2.socket_timeout=300
  # Now we define the load-balancing behaviour
  worker.loadbalancer.type=lb
  worker.loadbalancer.balanced_workers=node1,node2
  worker.loadbalancer.sticky_session=0
  4、在$APACHE/conf/目录创建新文件uriworkermap.properties,内容:
  /jmx-console=loadbalancer
  /jmx-console/*=loadbalancer
  /web-console=loadbalancer
  /web-console/*=loadbalancer
  5.配置JBOSS 4.2.2GA
  a).修改$JBOSSE/server/default/deploy/jboss-web.deployer/server.xml文件,将Engine 修改如下:
  <Engine name="jboss.web" defaultHost="localhost">
  给它增加一个jvmRoute属性:
  <Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
  b).修改 $JBOSS_HOME/server/default/deploy/ jboss-web.deployer /META-INF/jbossservice.xml 找到<attribute name="UseJK">该为:
  <attribute name="UseJK">true</attribute>
  c).修改$JBOSS_HOME/server/default/deploy/jboss-web.deployer/ROOT.war/WEB-INF/web.xml
  在<web-app>紧跟着下面添加 <distributable/>
  
  
  d).在$jboss/server/all/default/deploy/jboss-web-cluster.sar/META-INF/jboss-service.xml
  下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式,jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。
  <attribute name="CacheMode">REPL_ASYNC</attribute>
  REPL_ASYNC(异步)或者REPL_SYNC(同步)。
  在这个文件下面一点,还有一个config标签,里面指定了各个节点在进行session复制的时候如何通信,有udp和tcp两种可选,如果使用udp方式,那么应该将udp的lookback属性指定为true,因为windows上有一个叫做media sense的东西会影响udp multicast。注意如果你不了解multi address的ip规则,请不要随便修改mcast_addr的值。如果采用tcp方式的话,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,比如在我们的例子中,就应该这样配置tcp(以其中一个节点为例):
  <config> ( 在config之前有个注释符号<!--把他去掉,在config最后也有个 -->也去掉)
  <TCP bind_addr="192.168.1.95" start_port="7810" loopback="true"/>
  <TCPPING initial_hosts="192.168.1.95,192.168.1.198" port_range="3" timeout="3500"
  num_initial_members="3" up_thread="true" down_thread="true"/>
  <MERGE2 min_interval="5000" max_interval="10000"/>
  <FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" />
  <VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" />
  <pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"
  retransmit_timeout="3000"/>
  <pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" />
  <pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"
  print_local_addr="true" down_thread="true" up_thread="true"/>
  <pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
  </config>
  JBoss的clustering版主建议尽量使用udp。不过在Sobey内部,建议使用tcp方式,经测试可能有不明物体在影响udp通信,导致Timeout异常。
  
  e). 在WEB-INF中添加jboss-web.xml文件,内容如下
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE jboss-web PUBLIC
  "-//JBoss//DTD Web Application 4.2//EN"
  "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
  <jboss-web>
  <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>
  <context-root>/</context-root>
  </jboss-web>
  f).配置default目录,让该目录支持集群
  将如下文件从%JBoss_Home%/server/all/lib里面拷到%JBoss_Home%/server/default/lib目录下:
  jbossha.jar(加载org.jboss.ha.framework.server.ClusterPartition)
  jgroups.jar(JBoss集群底层通信协议)
  jboss-cache-jdk50.jar(加载org.jboss.cache.aop.TreeCacheAop)
  将如下文件从%JBoss_Home%/server/all/deploy里面拷到%JBoss_Home%/server/default/deploy目录下:
  deploy.last
  jboss-web-cluster.sar
  cluster-service.xml
  ejb3-clustered-sfsbcache-service.xml
  以上为服务器上的配置
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  以下为jboss集群中的另一台服务器配置
  安装JBOSS,安装jdk即可,安装步骤同上
  安装完成后,
  a). 修改JBOSS的server.xml配置文件使它能够支持所有网络访问,
  vi $jboss/server/default/deploy/jboss-web.deployer/server.xml
  修改
  <Connector port="8080" address="${jboss.bind.address}"
  为
  <Connector port="8080" address="0.0.0.0">
  修改
  <Connector port="8009" address="${jboss.bind.address}" protocol="AJP/1.3"
  为
  <Connector port="8009" address="0.0.0.0" protocol="AJP/1.3"
  
  b). 使得JBoss知道自己为Node2结点
  deploy/jboss-web.deployer目录下的server.xml
  <Engine name="jboss.web" defaultHost = "localhost">
  改为
  <Engine name="jboss.web" defaultHost= "localhost" jvmRoute="node2">。
  c). 通知Node 2添加一个jvmRoute值到会话cookies中,以便mod_jk可以路由随后的请求
  在deploy/jboss-web.deployer/META-INF目录下的jboss-service.xml
  <attribute name="UseJK">false</attribute>改为
  <attribute name="UseJK">true</attribute>。
  d)定义重定向地址
  在deploy/jboss-web-cluster.sar/META-INF目录下的jboss-service.xml
  <TCP bind_addr = "thishost" start_port = "7810" loopback= "true"…>
  改为
  <TCP bind_addr = "192.168.1.198" start_port= "7810" loopback="true"…>;
  <TCPPING initial_hosts= "thishost, otherhost" port_range="3"…>
  改为
  <TCPPING initial_hosts= "192.168.1.198, 192.168.1.95" port_range="3"…>。
  
  重启主服务器的apache,jboss,然后在启动最后配置的这台的jboss。启动命令都还记得不?呵呵
  apache : /usr/local/apache/bin/apachectl start
  jboss: /usr/local/jboss4.2.2.GA/bin/run.sh
  然后找台机子输入apache所在的IP地址,我的是
  http://192.168.1.95 这个时候你看到的是JBOSS的页面而不是it'swork
页: [1]
查看完整版本: 自己搭建的apache+jboss集群-步步为营