glassfish4+mod_jk集群搭建

所使用软件:httpd-2.2.3.tar.gz   mod_jk-1.2.28-httpd-2.2.X.so   glassfish4.0

软件来源:httpd-2.23.tar.gz在apache的官网上就可以下载到

mod_jk的版本必须要与所使用的httpd版本对应。可在http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries

进行选择。这里选用的是mod_jk-1.2.28-httpd-2.2.X.so。

Glassfish4.0在glassfish官网下载即可。

实验拓扑:

实验共涉及三台服务器。

服务器A:10.107.100.50,为glassfish集群的主控节点。

服务器B:10.107.100.53,为glassfish集群中的成员服务器。

服务器C:10.107.100.58,为安装有Apache,并进行任务转发和负载均衡的服务器。

 

1. 搭建glassfish平台

将glassfish复制到/home目录下并解压。进入根目录,输入bin/asadmin start-domain domain1,启动glassfish。

如果报错提示:secureadmin must be enabled to acess the DAS remotely。则说明glassfish不能远程登录。解决方法如下:

i)将glassfish的bin目录加入环境变量;

ii)启动glassfish ;

iii)切换到glassfish安装目录的bin目录下执行命令:asadmin enable-secure-admin。输入用户名和密码;

iv)再输入bin/asadmin restart-domain domain,重启即可。

(因为glassfish4以前默认的密码是缺省不用填的,所以需要再设一个admin的密码)

       集群搭建的总体流程应该是首先创建节点,再在各节点上创建实例,最后应用部署在每个实例上,都可以运行。

       本地的实例相对容易部署,我在50服务器上部署了节点50node,创建时Type选择SSH和CONFIG都可以,Node Directory和Installation Directory都不用填,默认即可。如果选择SSH,在下面SSH User Authentication选择Password,SSH User Password填写登录该主机的密码即可。

       远程实例创建比较麻烦。我在53服务器上部署了节点53node,与本地实例创建的不同在于,Node host需要填写53的IP,同时Type只能选择SSH方式。此时如果直接在该节点上创建instance,会报错,提示需要到53服务器上本地运行一个命令。但其实到该服务器上,这条命令也执行不了。解决方法是,将节点目录下的das.properties文件中,host的IP地址改为实际DAS所在的IP地址。

 

2.搭建Apache平台。

也可以通过yum安装,只是安装之后一定要弄清楚,安装的httpd是什么版本的,否则不能找到对用的mod_jk版本。

将httpd-2.2.3.tar.gz复制到/home目录下

1)解压

tar–zxvf httpd-2.2.3.tar.gz

2)解压以后,cd httpd-2.2.3 进入解压后的目录,在终端执输入以下命令:

./configure--prefix=/usr/local/httpd --enable-so --enable-proxy --enable-proxy-ajp--enable-proxy-http --enable-proxy-ftp --enable-proxy-connect--enable-proxy-balancer

      默认情况下,Apache安装是不会将这些文件编译进内核,因此,需要人工加载,而通过上述操作,在编译时会将这些DSO文件编译到内核中。

3)在终端输入:make

4)在终端输入:make install

5)安装目录默认在/usr/local/httpd下,进入该目录,在终端输入bin/apachectl –k start

6)在浏览器中输入http://myserver,默认是80端口,如果出现It works!,说明Apache(httpd)已经正常启动。

 

 

3.实现负载均衡

 

a)      通过加载mod_jk模块

1) 将mod_jk-1.2.28-httpd-2.2.X.so复制到httpd根目录下的modules目录中。

2)  对mod_jk进行配置

在conf/httpd.conf文件最后加入

include "${your httpd root dir}\conf\mod_jk.conf"

同样在该conf目录下,新建文件mod_jk.conf,其作用主要是使得Apache在启动时加载mod_jk模块,并对其进行一定的配置。文件内容如下:

LoadModulejk_module modules/mod_jk-1.2.28-httpd-2.2.X.so

 

# Whereto find workers.properties

JkWorkersFileconf/workers.properties

# Whereto put jk logs

JkLogFilelogs/mod_jk.log

# Setthe jk log level [debug/error/info]

JkLogLevelerror

#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"

JkShmFilelogs/mod_jk.shm

 

JkMount/* loadbalancer

内容分析:

前面一些显而易见的配置就不说了,主要是针对配置文件的存放路径。值得一提的是,JkMount/* loadbalancer这一配置。指的是指向该服务器的所有请求,都通过mod_jk转发给loadbalancer(这个在workers.properties里面有定义)。由于Apache的特点是支持静态网页,不能响应请求,动态生成页面。因此,有时配置是凡是jsp的这种对于动态页面的请求,由mod_jk将请求分发到后面的容器(tomcat、glassfish等),Apache直接响应静态页面的请求,则这里可以配置成JkMount/*.jsp loadbalancer(也就是说请求url后面是jsp结尾的,才进行分发)。但是,目前tomcat和glassfish对静态页面的响应速度也很快,也可以配置成转发所有请求。如果配置成JkMount/webapp/* loadbalancer,则表示对这个站点所有webapp目录下网页的请求都进行分发。

 

同样在该目录下,新建文件workers.properties。其作用主要是对所有负载服务器进行配置,包括服务器的地址和端口,端口主要是针对该主机上所运行的实例的,后面关于glassfish端的配置还会提到。文件内容如下:

# Define 1 real worker using ajp13

worker.list=loadbalancer

 

# Set properties for worker1 (ajp13)

worker.worker1.type=ajp13

worker.worker1.host=10.107.100.50

worker.worker1.port=8009

worker.worker1.lbfactor=1

worker.worker1.socket_keepalive=1

worker.worker1.socket_timeout=300

 

# Set properties for worker2 (ajp13)

worker.worker2.type=ajp13

worker.worker2.host=10.107.100.53

worker.worker2.port=8010

worker.worker2.lbfactor=1

worker.worker2.socket_keepalive=1

worker.worker2.socket_timeout=300

 

worker.loadbalancer.type=lb

worker.loadbalancer.balance_workers=worker1,worker2

#worker.loadbalancer.sticky_session=1

内容分析:

worker.list定义了所有的成员服务器,这里为loadbalancer。文件的后面也具体定义了loadbalancer指的是worker1,worker2(worker.loadbalancer.balance_workers=worker1,worker2)。而文件中也对worker1和worker2进行了具体配置。IP地址告诉mod_jk将请求转发给哪台服务器,而端口则具体到该服务器上的哪个实例。worker.loadbalancer.sticky_session=1是指是否开启session复制功能,这里就不详细叙述。

 

b)     启动Apache

在httpd根目录下,输入命令bin/apachectl –k start(或者bin/apachectl –k restart)。此时有可能直接报错,错误为invalid ELF header,则说明mod_jk的版本跟Apache不匹配。如果命令直接返回,没有其他任何输出,则说明有可能启动成功。此时输入命令ps –A|grep httpd,如果显示了进程号,则说明启动成功。如果没有进程号,则说明启动失败,可以通过查看log/error.log和log/mod_jk.log来定位错误。我当时没有成功启动的原因是workers.properites里配置了一条worker.worker1.reclycle_timeout=300,日志里面报错说什么300不对,我将这句话去掉之后就正常启动了。

 

c)      glassfish端的配置

此时,通过50服务器上的glassfish的console界面可以看到,集群已经部署完毕。现在要做的就是如何将集群上的每个instance和前端的mod_jk连接起来,使得任务可以分发到每个instance上。前面的workers.properties里面已经给每个主机定义了一个端口,这个端口就是AJP端口,使得前端的Apache和glassfish服务器之间通过AJP协议进行通信。因此,这里要给每个instance配置相应的AJP端口。

启动50服务器的shell,在glassfish的根目录下输入:bin/asadmin,进入配置程序。依次输入:

create-network-listener--protocol http-listener-1 --target oyxcluster --listenerport ${AJP_PORT}--jkenabled true jk-connector

create-jvm-options--target oyxcluster "-DjvmRoute=\${AJP_INSTANCE_NAME}"

create-system-properties--target on50 AJP_PORT=8009

create-system-properties--target on50 AJP_INSTANCE_NAME=on50

create-system-properties--target on53 AJP_PORT=8010

create-system-properties--target on53 AJP_INSTANCE_NAME=on53

       这里的http-listener-1指的是http协议,http-listener-2指的是https协议。

这样给两个主机上的instance分别配置了相应的AJP端口。配置完之后,进入glassfish网页的console界面,在每个instance的system properties都新增了AJP端口。

而后启动每个实例,集群就搭建起来了。

 

4.总结

在整个配置过程中,也出现过很多问题。如果始终登陆不了glassfish,可能是因为glassfish所在的主机防火墙没关。解决这一问题比较简单的方法是将防火墙关掉,命令为“/etc/init.d/iptablesstop”。

还值得一提的是,glassfish V4.0的重点不在于解决集群问题。我看过它的代码,发现关于集群方面的代码还是用的3版本的。因此,也可以参照glassfish3的相关方法,熟悉glassfish4集群的搭建。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值