一.环境准备
- 虚拟机的版本: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 "%r" %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网站。