环境:
云服务器两台:192.168.0.2
192.168.0.3
系统:centos7
版本:Apache2.4
Tomcat8.5
Apache安装在192.168.0.2上,并且使用mod_jk配置负载均衡,
Apache绑定域名a.com,和b.com,a.com作为官网,php开发,
b.com作为api接口域名,给app或前端页面调用接口。
Tomcat安装分别安装在192.168.0.2和192.168.0.3上。
这里不介绍软件安装方法,只介绍配置方法。
需求:如图:
现需要
- 访问a.com后,不需要tomcat处理,只需要请求到apache绑定的a.com的目录下的资源文件即可。也就是访问a.com,直接请求192.168.0.2上的a.com目录文件。
- 访问b.com后需要通过负载均衡分配给tomcat1和tomcat2处理。
Apache配置
本文apache为yum安装
vim /etc/httpd/conf/httpd.conf
在文件末尾添加上绑定的域名信息
绑定域名a.com
NameVirtualHost *80
<VirtualHost *:80>
DocumentRoot /var/www/html/a.com
ServerName a.com
DirectoryIndex index.html index.htm index.jsp
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/b.com
ServerName b.com
DirectoryIndex index.html index.htm index.jsp
JkMount /* controller #重点配置
JkMount /jkstatus stat #重点配置
</VirtualHost>
JkMount /* controller 意思是将此域名是所有请求都交由 controller控制器管理
JkMount /jkstatus 将此域名下的所有/jkstatus所有路径都交由stat控制器管理
这里的controller,stat控制器即是下文中workers.properties 配置的控制器。
如果不设置,那么b.com的访问跟会a.com访问一样会直接请求html/b.com的目录文件了,那么负载均衡将无法转发任何流量。
配置负载均衡
apache2.4的httpd.conf文件末尾已自动加载conf.d下面的所有配置文件,所以我们只需要在这个目录新建配置文件即可,无需再去httpd.conf添加引用
新建mod_jk.conf
vim /etc/httpd/conf.d/mod_jk.conf
LoadModule jk_module modules/mod_jk.so #编译好的mod_jk.so文件,编译好会自动在modules目录生成
JkWorkersFile conf.d/workers.properties #加载负载均衡配置文件
JkMountFile conf.d/uriworkersmap.properties #加载负载均衡忽略文件
JkLogFile logs/mod_jk.log #设置日志路径
JkLogLevel info #设置日志级别 info debug warn
新建workers.properties
vim /etc/httpd/conf.d/workers.properties
#work 控制器
worker.list = controller,stat
#========tomcat1========
worker.tomcat1.port=8009 #ajp13端口号,在tomcat下server.xml配置,默认 8009 默认无需修改
worker.tomcat1.host=192.168.0.2 #tomcat的主机地址
worker.tomcat1.type=ajp13 #协议类型
worker.tomcat1.lbfactor=1 # 值越高,分得的请求越多。
#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.0.3
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#========controller,负载均衡控制器========
worker.controller.type=lb #负载均衡控制器类型,lbfactor是负载平衡因数(Load Balance Factor)
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat列表
# 粘性session(默认是打开的)
# 当该属性值=true(或1)时,代表session是粘性的,
worker.controller.sticky_session=true
#错误发生时的重试次数
worker.retries=3
# 设置用于负载均衡的server的session可否共享
worker.controller.sticky_session_force=false
worker.stat.type=status #负载均衡状态查看设置
worker.controller.sticky_session,设置为1或true使用粘着session,设置为0或false不使用粘着session。如果sticky_session设为true时,建议sticky_session_force设为false,
此参数表明如果集群中某台服务器在多次请求没有响应后,将转发当前的请求到其它服务器上处理;sticky_session=false时,影响比较大,会导致转发到其它服务器上的请求,找不到原来的session,
所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。sticky_session、sticky_session_force的默认值分别为true,false。
sticky_session | sticky_session_force | 含义 |
---|---|---|
true | false | SESSION会复制,有粘性 |
true | true | SESSION不复制,有粘性 |
false | false | SESSION会复制,无粘性 |
false | true | SESSION会复制,无粘性 |
新建
vim /etc/httpd/conf.d/uriworkersmap.properties
/*=controller
/jkstatus=stat
!/*.jpg=controller
!/*.gif=controller
!/*.png=controller
!/*.bmp=controller
!/*.html=controller
!/*.htm=controller
!/*.css=controller
!/*.js=controller
!/*.jpg=controller 表示controller控制器放行jpg文件
/jkstatus=stat 表示/jkstatus路径又stat控制器控制
jkstatus目录是查看负载均衡的状态的页面,如果不放行将无法查看此页面
Tomcat设置
编辑配置文件
vim /usr/tomcat/apache-tomcat-8.5.31/conf/server.xml
编辑Engine标签,添加上jvmRoute=“tomcat1”,tomcat1即workers.properties 中的tomcat名称。
两个tomcat都要修改,
192.168.0.2 jvmRoute="tomcat1"
192.168.0.3 jvmRoute="tomcat2"
测试
偷懒复制了个页面,
在两个tomcat的运行目录下新建test.jsp文件;
test.jsp
vim /usr/tomcat/apache-tomcat-8.5.31/webapps/test.jsp
<%@ page language="java" %>
<html>
<head><title>Tomcat1 <!-- (tomcat2改为2)--></title></head>
<body>
<h1><font color="red">Tomcat1 <!-- (tomcat2改为2)--></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
访问a.com:正常显示a.com的网站类容
访问b.com/test.jsp
由于启用了session,所以刷新并不会改变处理的tomcat服务器,需要用浏览器的隐身模式访问。
关掉后重新访问:
可以看到b.com所有jsp的动态请求,都会交给tomcat1或者tomcat2处理。