Tomcat高可用集群(实例详解)

一.环境准备

  • 虚拟机的版本:VMware-workstation-full-15.5.6-16341506.exe
  • 系统镜像版本:CentOS-6.10-x86_64-bin-DVD1.iso,全新安装,桌面版,可上网
  • 系统内存大小:1GB
  • 系统硬盘大小:20GB
  • 连接工具版本:SecureCRTSecureFX_HH_x64_7.0.0.326.zip

二.集群概述

由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流程的做法就是通过Nginx来实现Tomcat集群的负载均衡。

三.集群架构

1. 安装第一台Tomcat服务器

解压:

tar -zxvf apache-tomcat-8.5.57.tar.gz

安装:

mv apache-tomcat-8.5.57 /usr/local/tomcat1

创建测试目录和页面:

mkdir -p /usr/local/tomcat1/webapps/edu
echo "<h1>This is 8080 Port</h1>" > /usr/local/tomcat1/webapps/edu/a.html

开放防火墙:

/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
/etc/rc.d/init.d/iptables save

启动:

/usr/local/tomcat1/bin/startup.sh

2.安装第二台Tomcat服务器

解压:

tar -zxvf apache-tomcat-8.5.57.tar.gz

安装:

mv apache-tomcat-8.5.57 /usr/local/tomcat2

修改端口:

3.安装Nginx反向代理服务器

安装依赖:

yum install -y gcc gcc-c++ make libtool wget pcre pcre-devel zlib zlib-devel openssl openssl-devel

Nginx下载:

wget http://nginx.org/download/nginx-1.18.0.tar.gz

Nginx解压:

tar -zxvf nginx-1.18.0.tar.gz

Nginx安装:

cd nginx-1.18.0
./configure
make && make install

注意:安装完成后的路径为:/usr/local/nginx

 Nginx配置:

vi /usr/local/nginx/conf/nginx.conf
#在 server 外边配置,负载均衡服务列表
upstream myserver {
	server 192.168.239.144:8080;
	server 192.168.239.144:8081;
}

#在 location / { 里边配置,路径请求转发规则
	proxy_pass http://myserver;
/usr/local/nginx/sbin/nginx

Nginx命令:

  • 普通启动服务:/usr/local/nginx/sbin/nginx
  • 配置文件启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  • 暴力停止服务:/usr/local/nginx/sbin/nginx -s stop
  • 优雅停止服务:/usr/local/nginx/sbin/nginx -s quit
  • 检查配置文件:/usr/local/nginx/sbin/nginx -t
  • 重新加载配置:/usr/local/nginx/sbin/nginx -s reload
  • 查看相关进程:ps -ef | grep nginx

开放防火墙: 

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/rc.d/init.d/iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:[确定]

访问测试:

打开浏览器访问:ip+/edu/a.html

4.如何解决session共享问题

实例一、ip_hash 策略

通过修改Nginx配置文件,让每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:

upstream server_pool{
ip_hash;
server ip1:80;
server ip2:80;
}

实例2:session 复制

在每台Tomcat的 conf/server.xml 配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

在每台Tomcat部署的应用程序中,例如:servlet_demo 的 web.xml 中加入如下配置 :

<distributable/>

注意:上述方案,适用于较小的集群环境(节点数不超过4个),如果集群的节点数比较多的话,通过这种广播的形式来完成Session的复制,会消耗大量的网络带宽,影响服务的性能。

四.Tomcat 安全问题

1.配置安全

  • 删除webapps目录下的所有文件
  • 禁用tomcat管理界面
  • 注释或删除tomcat-users.xml文件内的所有用户权限
  • 更改关闭tomcat指令或禁用
  • 定义错误页面

2.应用安全

在大部分的Web应用中,特别是一些后台应用系统,都会实现自己的安全管理模块(权 限模块),用于控制应用系统的安全访问,基本包含两个部分:认证(登录/单点登录) 和授权(功能权限、数据权限)两个部分。对于当前的业务系统,可以自己做一套适用 于自己业务系统的权限模块,也有很多的应用系统直接使用一些功能完善的安全框架, 将其集成到我们的web应用中,如:SpringSecurity、Apache Shiro等。

3.传输安全

HTTPS的全称是超文本传输安全协议(Hypertext Transfer Protocol Secure),是一种网络安全传输协议。在HTTP的基础上加入SSL/TLS来进行数据加密,保护交换数据不被泄露、窃取。

SSL 和 TLS 是用于网络通信安全的加密协议,它允许客户端和服务器之间通过安全链接 通信。SSL 协议的3个特性:

  • 保密:通过SSL链接传输的数据时加密的。
  • 鉴别:通信双方的身份鉴别,通常是可选的,单至少有一方需要验证。
  • 完整性:传输数据的完整性检查。

从性能角度考虑,加解密是一项计算昂贵的处理,因为尽量不要将整个Web应用采用SSL 链接, 实际部署过程中, 选择有必要进行安全加密的页面(存在敏感信息传输的页面) 采用SSL通信。

HTTPS和HTTP的区别主要为以下四点:

  • HTTPS协议需要到证书颁发机构CA申请SSL证书,然后与域名进行绑定,HTTP不用申请证书。
  • HTTP是超文本传输协议,属于应用层信息传输,HTTPS则是具有SSL加密传安全性传输协议,对数据的传输进行加密,相当于HTTP的升级版。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是8080,后者是8443。
  • HTTP的连接很简单,是无状态的、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

HTTPS协议优势:

  • 提高网站排名,有利于SEO。谷歌已经公开声明两个网站在搜索结果方面相同,如果 一个网站启用了SSL,它可能会获得略高于没有SSL网站的等级,而且百度也表明对安装了SSL的网站表示友好。因此,网站上的内容中启用SSL都有明显的SEO优势。
  • 隐私信息加密,防止流量劫持。特别是涉及到隐私信息的网站,互联网大型的数据泄露的事件频发发生,网站进行信息加密势在必行。
  • 浏览器受信任。 自从各大主流浏览器大力支持HTTPS协议之后,访问HTTP的网站都会提示“不安全”的警告信息。

Tomcat支持HTTPS:这里采用单实例版本的Tomcat进行配置测试:

 第一步:查找密钥库生成器,这个工具是java提供的

find / -name keytool
/usr/bin/keytool
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/bin/keytool
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.181.x86_64/jre/bin/keytool
/etc/alternatives/keytool

第二步:生成密钥库文件

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.181.x86_64/jre/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkey.keystore
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?(这里使用的必须是域名)
  [Unknown]:  www.abc.com
您的组织单位名称是什么?
  [Unknown]:  abc
您的组织名称是什么?
  [Unknown]:  abc
您所在的城市或区域名称是什么?
  [Unknown]:  BeiJing
您所在的省/市/自治区名称是什么?
  [Unknown]:  BeiJing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=www.abc.com, OU=abc, O=abc, L=BeiJing, ST=BeiJing, C=CN是否正确?
  [否]:  Y

输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):  

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcatkey.keystore -destkeystore tomcatkey.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

第三步:将密钥库文件 tomcatkey.keystore 复制到tomcat/conf目录下

cp tomcatkey.keystore /usr/local/tomcat/conf/

第四步:配置tomcat/conf/server.xml

先删除:

rm -rf /usr/local/tomcat/conf/server.xml

先添加:

vi /usr/local/tomcat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
	<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
	<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
	<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

	<GlobalNamingResources>
		<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />
	</GlobalNamingResources>



	<Service name="Catalina">
		<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

		<!-- 主要新增的代码 -->
		<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" schema="https" secure="true" SSLEnabled="true">
			<SSLHostConfig certificateVerification="false">
				<Certificate certificateKeystoreFile="/usr/local/tomcat/conf/tomcatkey.keystore" certificateKeystorePassword="123456" type="RSA" />
			</SSLHostConfig>
		</Connector>

		<Engine name="Catalina" defaultHost="localhost">
			<Realm className="org.apache.catalina.realm.LockOutRealm">
				<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
			</Realm>
			<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
				<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
			</Host>
		</Engine>
	</Service>
</Server>

第五步:关闭服务器,防止启动失败,然后再启动访问

/usr/local/tomcat1/bin/shutdown.sh 
/usr/local/tomcat2/bin/shutdown.sh  
/usr/local/nginx/sbin/nginx -s quit
/usr/local/tomcat/bin/startup.sh

第六步:配置主机域名映射

在/etc/hosts中 ,增加一条记录。

#虚拟机的IP地址       虚拟域名
192.168.1.1        www.abc.com

打开浏览器进行访问:www.abc.com:8443即可访问到tomcat网站。

  • 31
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值