linux Apache+jk+tomcat集群配置
最近在学习apache集群搭建,这里是我搭建进群的心得。
一:环境
系统:linux(红帽)
apache : httpd-2.2.3.tar.gz
连接器mod_jk : tomcat-connectors-1.2.43-src
tomcat : apache-tomcat-8.0.48这里在同一台机器上,复制两个
jdk : jdk1.8.0_151
二:安装软件
Apache安装在此就不介绍了,,可以参照:https://blog.****.net/sunxiaofeng_sdn/article/details/80278740
1,mod_jk安装。
# tar -zxvf tomcat-connectors-1.2.43-src.tar.gz
#cd tomcat-connectors-1.2.43-src/native
# ./configure--with-apxs=/usr/local/apache/bin/apxs
# make
# make install
最后将tomcat-connectors-1.2.43-src/apache-2.0下的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。
# cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/2,tomcat
这里把tomcat复制两个,分别为tomcat1,tomcat2
修改分别修改tomcat1和tomcat2中server.xml中的端口,防止端口冲突。
tomcat1中server.xml三个端口如下:
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8091" protocol="AJP/1.3" redirectPort="8443" />
tomcat2中server.xml三个端口如下:
<Server port="8007" shutdown="SHUTDOWN">
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8092" protocol="AJP/1.3" redirectPort="8443" />
最后分别启动两个tomcat,并且可以正常访问。
apache目录:/usr/local/apache
tomcat1目录:/usr/local/tomcat1
tomcat2目录:/usr/local/tomcat2
mod_jk目录:/usr/local/tomcat-connectors-1.2.43-src
三:配置1,配置httpd.conf
#vim /usr/local/apache/conf/httpd.conf
在文件中添加如下代码:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
<Ifmodule mod_jk.c>
#指定workers.properties文件路径
JkWorkersFile /usr/local/apache/conf/workers.properties
#指定jk logs文件存放位置
JkLogFile /usr/local/apache/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 indicate to send SSL KEYSIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
#JkRequestLogFormat set the requestformat
JkRequestLogFormat "%w %V %T %q %U%R"
#JkShmFile to put logs
JkShmFile /usr/local/apache/logs/mod_jk.shm
JKMount /TEST* controller
</IfModule>
#指定哪些请求交给tomcat处理,哪些请求交给apache处理
#注意:" controller"为在workers.propertise里指定的负载分配控制器
JkMount /TEST controller#所有的TEST下的请求都交给tomcat处理
2,创建workers.properties并编辑
#touch workers.properties
编辑 vim workers.properties添加如下内容:
# workers 列表
worker.list=controller
#--------------------------------------------------------------------
# 第一个tomcat
#--------------------------------------------------------------------
worker.tomcat1.port=8091 #对应tomcat的server.xml中配置的ajp13端口号
worker.tomcat1.host=localhost #tomcat1的主机地址,如不为本机,请填写IP地址
worker.tomcat1.type=ajp13 #定向包协议
worker.tomcat1.lbfactor=1 #server的负载分配权重,值越高,分得的请求越多
#以下为非必要配置,这部分配置tomcat2的配置同tomcat1
#worker.tomcat1.cachesize=1000 #配置tomcat的jk连接缓存大小 (非必要)
#worker.tomcat1.cachesize_timeout=600 # (非必要)
#worker.tomcat1.reclycle_timeout=300 # (非必要)
#worker.tomcat1.socket_keepalive=1 #防止防火墙切断未**的网络连接(非必要)
#worker.tomcat1.socket_timeout=300 #(非必要)
#worker.tomcat1.local_worker=1 # (非必要)
#worker.tomcat1.retries=3 # (非必要)
#----------------------------------------------------------------------
# 第二个tomcat
#----------------------------------------------------------------------
worker.tomcat2.port=8092
worker.tomcat2.host=localhost #tomcat2的主机IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#----------------------------------------------------------------------
# load controller-负载均衡控制器
# ---------------------------------------------------------------------
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=true #设置为粘性session
worker.controller.sticky_session_force=false #设置当多次请求未响应,请求将转发
worker.status.type=status
三:测试
创建一个web项目,项目名称为TEST,然后创建一个index.jsp,分别部署在tomcat1中和tomcat2中
tomcat1中index.jsp如下:
tomcat2中index.jsp如下:
然后重启,Apache和tomcat1,tomcat2
访问Apache如下图所示(我的Apache端口81):
再刷新一下
此时tomcat分发已经大功告成了,但是大家发现sessionId不一样,说明session没有共享,接下来我们介绍session如何共 享。
课外,单纯转发tomcat:
此时如果只是用来Apache转发tomcat的话已经可以了,只不过不需要添加到到负载均衡控制器中。
比如:现在有一个tomcat3,ajp端口是8093. 项目是TEST2,需要修改配置如下:
在httpd.conf中添加
JKMount /TEST2* tomcat3
在workers.properties添加
worker.list=controller,tomcat3
worker.tomcat3.port=8092
worker.tomcat3.host=localhost #tomcat2的主机IP地址
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor=1
这样访问http://localhost:81/TEST2/login.jsp就可以了,注意一定不要网控制器中加,因为这只是转发,不是集群。
四:session共享配置
1,首先修改tomcat中server.xml文件配置
tomcat1:修改如下:
设置jvmRoute名称,这个名称和workers.properties文件中work.后面的名称一致
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
最后去掉<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>两边的注释。
tomcat2:修改如下(和tomcat区别在于jvmRoute):
设置jvmRoute名称,这个名称和workers.properties文件中work.后面的名称一致
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
最后去掉<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>两边的注释。
注:session管理器:
DeltaManager:集群下某个节点创建、改动的Session,都将复制到其他节点,每个节点部署的应用要一样。这个管 理器是tomcat默认的集群配置,适用于一般的小型集群。
BackupManager:集群下产生的所有Session都将放到一个备份节点,集群下的所有节点都可以访问此备份节点,每 个节点部署的应用 可以不一样。
具体,查看tomcat官网。
2,设置distributable
在tomcat中context.xml添加属性distributable="true"
<Context distributable="true">
或者
在项目web.xml 中</web-app>前面添加<distributable/>
注:这个标签是进行session复制所必须的,否则不能进行seeeion复制。
3,设置session粘性
worker.controller.sticky_session=true #设置为粘性session
worker.controller.sticky_session_force=false #设置当多次请求未响应,请求将转发
sticky_session sticky_session_force 含义说明:
worker.controller.sticky_session,设置为1或true使用粘着session,设置为0或false不使用粘着session。如果sticky_session设为true时,建议sticky_session_force设为false,此参数表明如果集群中某台服务器在多次请求没有响应后,将转发当前的请求到其它服务器上处理;sticky_session_force=true时,影响比较大,会导致转发到其它服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。sticky_session、sticky_session_force的默认值分别为true,false。
worker.controller.sticky_session=false,提交页面,将按照负载均衡的规则切换服务器,实现“完全的负载均衡”,代价是Tomcat不停交换session数据,慢;
worker.controller.sticky_session=true,提交页面将仍使用同一服务器(session建立在哪就用哪台),不能保证完完全全的负载均衡,但相对能省频繁切换服务器的代价。可能会变上面的快一些。所有请求始终转发到session创建的服务器上。
true false SESSION会复制,有粘性
true true SESSION不复制,有粘性
false false SESSION会复制,无粘性
false true SESSION会复制,无粘性
4,验证session共享
验证一:
worker.controller.sticky_session=true
worker.controller.sticky_session_force=false
结果:第一次访问时tomcat2服务器,添加session值tomcat2=2后请求还是tomcat2,之后刷新一直是此服务器。
停掉tomcat2服务,再刷新页面结果如下:
这时候可以看到,请求访问到了tomcat1,同事session值也复制了。
worker.controller.sticky_session=true
worker.controller.sticky_session_force=true
结果:第一次访问时tomcat1服务,添加session值tomcat1=1后请求还是tomcat1,之后刷新一直是此服务器。
停掉tomcat1服务,然后刷新页面结果如下:
结果,并没有重新转发到tomcat2上,关闭浏览器重新打开或清除缓存,重新请求结果如下:
可以访问到tomcat2上。
验证三:
worker.controller.sticky_session=false
worker.controller.sticky_session_force=false
结果:第一次访问时tomcat1服务,添加session值tomcat1=1后请求转发到tomcat2,之后刷新会根据负载负载权重进 行分配。
上图可以看出把tomcat1中添加的session值复制到了Tomcat2了,此时我们添加tomcat2=2,提交结果如下:
此时转发到tomcat1服务上了,同时也复制了tomcat2添加到session中的值tomcat2=2.
注:具体请求到那个服务上是根据配置的权重进行分配的,不一定是交替
验证四:
worker.controller.sticky_session=false
worker.controller.sticky_session_force=true
结果:验证结果和验证三一致。