本次实现项目内容: 分别实现下述架构方案: (1)nginx|apache(mod_proxy_ajp) --> tomcat; (2) apache(mod_proxy_ajp) --> tomcat servers;额外实现session sticky; (3) haproxy --> apache(mod_proxy_ajp) --> tomcat session cluster;

架构环境(博主此次使用的虚拟机都是CentOS7.5): 172.16.75.5 反代服务器 172.16.75.6 Tomcat服务器1 172.16.75.7 Tomcat服务器2

架构一: 客户端-->nginx反代服务器-->Tomcat服务器1 nginx反代服务器中的操作: ~]# vim /etc/nginx/nginx.conf 添加这两行即可; ~]# nginx -t //检查是否格式正确 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ~]# nginx ~]#vim /etc/hosts 172.16.75.6 tc1.wzc.com 做到这里,我们的nginx反代服务器的配置就完成了; Tomcat1中的操作: 首先我们要安装JDK:OpenJDK: 安装JDK:java-VERSION-openjdk、java-VERSION-openjdk-headless、java-VERSION-openjdk-devel 这里我们直接: ~]#yum install java-devel -y //这样安装即可 ~]# java -version openjdk version "1.8.0_171" OpenJDK Runtime Environment (build 1.8.0_171-b10) OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode) 如果系统没有定义JAVA_HOME环境变量,需要配置并指定Java的安装路径; OpenJDK: ~] # vim /etc/profile.d/java.sh //写入这下面的一行内容即可 export JAVA_HOME=/usr ~]# source /etc/profile.d/java.sh

接下来是安装Tomcat: 这里我们使用官方提供的Tomcat Binary Release From ASF进行安装(博主是用的是apache-tomcat-8.0.23.tar.gz源码包,内部包含catalina.sh脚本文件): ~]# tar -xf apache-tomcat-VERSION.tar.gz -C /usr/local ~]# cd /usr/local ~]# ln -sv /usr/local/apache-tomcat-VERSION tomcat ~]# cat /etc/profile.d/tomcat.sh //下面是要在里面要编辑的内容,用来在根目录中使用catalina.sh脚本用的 export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin:$PATH ~]# source /etc/profile.d/tomcat.sh ~]# mkdir -pv /tcapps/webapps/ROOT/{classes,lib,WEB-INF,META-INF} ~]# vim /tcapps/webapps/ROOT/index.jsp //一个简单的页面测试内容,这里博主就不粘图片了方便大家使用 <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <font color="red">tc1.wzc.com</font> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("tc1.wzc.com","tc1.wzc.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> //保存即可 ~]# vim /usr/local/tomcat/conf/server.xml 添加(不是修改)箭头所指内容即可; ~]# catalina.sh start 这两个端口打开即可; 这是我们在客户端修改host文件添加172.16.75.5 java.wzc.com和172.16.75.6 tc1.wzc.com 这样就可以访问 java.wzc.com了,他会被直接反代到tc1.wzc.com,访问如下:

架构二: 客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat服务器1 LAMT: Linux + Apache(httpd) + MySQL/MariaDB + Tomcat httpd的代理功能模块: proxy_module:实现httpd代理功能的核心模块; proxy_ajp_module:以ajp协议的客户端身份实现反向代理功能; proxy_http_module:以http协议的客户端身份实现反向代理功能; jk_module:以ajp协议的客户端身份实现反向代理功能;

三种代理模型:
	Client(http/https) --> httpd(proxy_http_module)(http) --> tomcat(http connector)
	Client(http/https) --> httpd(proxy_ajp_module)(http) --> tomcat(ajp connector)
	Client(http/https) --> httpd(jk_module)(http) --> tomcat(ajp connector)

第一种模型:使用http协议连接tomcat服务器的http连接器;
	/etc/httpd/conf.d/proxy_http_mod.conf
	<VirtualHost *:80>
		ProxyRequests Off
		ProxyPreserveHost On
		<Proxy *>
			Require all granted
		</Proxy>
		ProxyPass / http://tc1.wzc.com:8080
		<Location />
			Require all granted
		</Location>
	</VirtualHost>

第二种模型:使用ajp协议连接tomcat服务器的ajp连接器;
/etc/httpd/conf.d/proxy_ajp_mod.conf
	<VirtualHost *:80>
		ProxyRequests Off
		ProxyPreserveHost On
		<Proxy *>
			Require all granted
		</Proxy>
		ProxyPass / ajp://tc1.wzc.com:8009
		<Location />
			Require all granted
		</Location>
	</VirtualHost>

第三种模型:使用mod_jk模块通过ajp协议连接tomcat服务器的ajp连接器;
	mod_jk.so模块不是httpd自带的模块,属于第三方功能模块,需要额外编译安装;
	此模块有tomcat官方提供,可以从tomcat.apache.org站点下载tomcat-connector程序包;进行编译安装即可;

	确保系统上已经安装了完整的开发环境,并且保证httpd-devel也已经正确安装;

]# yum -y groupinstall "Development Tools" "Server Paltform Develop" ]# yum -y install httpd-devel ]# tar xf tomcat-connectors-1.2.40-src/native ]# cd tomcat-connectors-1.2.40-src/native ]# ./configure --with-apxs=/usr/bin/apxs ]# make -j 4 && make install

	安装成功后,mod_jk模块会被复制到/usr/lib64/httpd/modules/mod_jk.so

	对于mod_jk来说,所有后端被代理的服务器,都被称为"worker";

	创建mod_jk的配置文件:/etc/httpd/conf.d/proxy_jk_mod.conf
		LoadModule jk_module modules/mod_jk.so

		JkWorkersFile /etc/httpd/conf.d/workers.properties
		JkMount /* tc1
		JkLogFile logs/jk_module.log
		JkLogLevel warn
		JkMount /jk-status tcstat
		<Location />
			Require all granted
		</Location>

	创建workers的属性定义文件:/etc/httpd/conf.d/workers.properties
		worker.list=tc1,tcstat
		worker.tc1.host=172.16.75.6
		worker.tc1.port=8009
		worker.tc1.type=ajp13
		worker.tcstat.type=status

	重新启动httpd即可;

这里我们使用apache(mod_proxy_ajp) 在反代服务器中的操作: ~]# nginx -s stop ~]# cd /etc/httpd/conf.d/ conf.d]# vim proxy_ajp_lb.conf 保存,完成反代服务器中的操作; 在Tomcat1中的操作: ~]# vim /usr/local/tomcat/conf/server.xml 像我一样,把这一段注释掉<!-- -->注释号 修改之前的localhost为图示内容即可;

~]# catalina.sh stop //隔几秒在开启 ~]# catalina.sh start //再次开启 这是我们就可以在客户端中进行访问了:

架构三(LAMT负载均衡): 客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat服务器1,Tomcat服务器2 这里我们还是使用apache(mod_proxy_ajp) 在反代服务器中的操作: ~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf <Proxy "balancer://tcsrvs"> BalancerMember ajp://tc1.wzc.com:8009 BalancerMember ajp://tc2.wzc.com:8009 ProxySet lbmethod=byrequests

</Proxy>

<VirtualHost *:80> ServerName java.wzc.com ProxyRequests Off ProxyPass / balancer://tcsrvs <Location /> Require all granted </Location> </VirtualHost> ~]# systemctl restart httpd ~]#vim /etc/hosts 172.16.75.7 tc2.wzc.com 在Tomcat2中的操作同Tomcat1,该安装安装,该编辑配置文件并重载的就和Tomcat1一样,该注释注释,该添加添加,该修改修改; 然后在客户端访问java.wzc.com即可看到如下图示,重复刷新查看效果: 怎样额外实现session sticky呢? 这里只需在反代服务器中修改配置文件即可: ~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy "balancer://tcsrvs"> BalancerMember ajp://tc1.wzc.com:8009 route=tc1 BalancerMember ajp://tc2.wzc.com:8009 route=tc2 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </Proxy>

<VirtualHost *:80> ServerName java.wzc.com ProxyRequests Off ProxyPass / balancer://tcsrvs <Location /> Require all granted </Location> </VirtualHost> ~]# systemctl restart httpd 再次访问: 再怎么刷新,也都是这一种显示了,但这时负载均衡就失去了意义;

架构四: 客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat session cluster 这里我们还是使用apache(mod_proxy_ajp): 在反代服务器中的操作: ~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf <Proxy "balancer://tcsrvs"> BalancerMember ajp://tc1.wzc.com:8009 BalancerMember ajp://tc2.wzc.com:8009 ProxySet lbmethod=byrequests

</Proxy>

<VirtualHost *:80> ServerName java.wzc.com ProxyRequests Off ProxyPass / balancer://tcsrvs <Location /> Require all granted </Location> </VirtualHost> ~]# systemctl restart httpd 然后在Tomcat服务器中的操作 ~]# vim /usr/local/tomcat/conf/server.xml //Tomcat2中要添加的内容,在Tomcat1中做同样的操作修改address="172.16.75.7"为address="172.16.75.6"即可; <Host name="tc2.wzc.com" appBase="/tcapps/webapps" unpackWARs="true" autoDeploy="true"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
				 expireSessionsOnShutdown="false"
				 notifyListenersOnReplication="true"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">
	<Membership className="org.apache.catalina.tribes.membership.McastService"
							address="228.100.0.4"
							port="45564"
							frequency="500"
							dropTime="3000"/>
	<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
						address="172.16.75.7"
						port="4000"
						autoBind="100"
						selectorTimeout="5000"
     maxThreads="6"/>

	<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
		<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
	</Sender>
	<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
	<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
				filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
	
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
					tempDir="/tmp/war-temp/"
					deployDir="/tmp/war-deploy/"
					watchDir="/tmp/war-listen/"
					watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster> </Host> ~]# catalina.sh stop //还是和刚才一样等一会在开启,并且两台Tomcat服务器中做相同操作 ~]# catalina.sh start

为集群内生效的webapp提供web.xml部署描述符配置文件,并于其中添加<distributable/>元素; ~]# cp /usr/local/tomcat/conf/web.xml /tcapps/webapps/ROOT/WEB-INF ~]# vim /tcapps/webapps/ROOT/WEB-INF/web.xml 添加这个<distributable/>,如图所示; ~]#vim /etc/sysconfig/network-scripts/ifcfg-配置_1 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none IPADDR=172.16.75.6 PREFIX=16 DEFROUTE=yes NAME=$'\751\605\615\747\675\656 1' UUID=951188c1-b210-4027-8e67-669095a737e8 ONBOOT=yes GATEWAY=172.16.75.5 //设置网关,两台Tomcat服务器做相同配置 这时我们就可以在客户端进行访问了,重复刷新看到如下内容: 看到的结果是session ID和timestamp是不变的,只有tc1.wzc.com和tc2.wzc.com时轮流显示的。