1. tomcat 基本概述
1.1 Tomcat是什么?
1. 与nginx一样是web服务器,提供Java的解析以及静态资源的解析
2. 不同的是nginx只能解析静态资源,tomcat可以解析java和静态资源
3. 企业中一般会使用tomcat+nginx,tomcat解析动态资源(Java) nginx解析静态资源
# tomcat+nginx
[root@web01 ~]# cat /etc/nginx/conf.d/tomcat.zy.com.conf
server {
listen 80;
server_name tomcat.zy.com;
location / {
proxy_pass http://127.0.0.1:8080; # 通过反向代理的方式
}
location ~* \.(png|gif|jpg)$ {
root /images;
}
}
1.2 为什么要先安装Java?
tomcat是java的程序,那就要运行在jiava环境中
jvm: java的虚拟机
jre: java的运行环境 包含了jvm虚拟机
jdk: java的开发环境 包含了jre
单纯的运行java项目需要提供 jvm + jre =jdk=java
2. tomcat的安装
2.1 安装运行环境
$ yum install java -y
2.2 安装tomcat
# 准备tomcat代码目录
mkdir /soft
# 下载tomcat代码
cd /soft && \
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz && \
tar xf apache-tomcat-9.0.37.tar.gz && \
ln -s apache-tomcat-9.0.37 tomcat
3. tomcat 配置文件
3.1 虚拟主机配置文件认识
<?xml version="1.0" encoding="UTF-8"?>
<!--server表示的是一个Tomcat实例,可以通过本地8005端口关闭Tomcat-->
<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>
<!--Base认证模块、所有站点都能用 conf/tomcat-users.xml文件 -->
<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">
<!--<!--Http连接器,处理http的请求与响应-->-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--引擎-->
<Engine name="Catalina" defaultHost="localhost">
<!--调用Basic认证-->
<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>
3.2 Tomcat 虚拟主机配置图解
1. 定义虚拟主机 域名·为tomcat1.zy.com
<Host name="tomcat1.zy.com" appBase="/code/tomcat1"
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>
2. 创建站点目录
mkdir /code.tomcat1/ROOT
echo 'tomcat testing is OK!' > /code/tomcat1/ROOT/index.html
3. 重启tomcat
$ /soft/tomcat/bin/shutdown.sh
$ /soft/tomcat/bin/startup.sh
4. 浏览器访问
5. 配置 不同 uri 访问不同资源 (相当于配置nginx中的location)
#context 相当于nginx的 location 在虚拟主机中配置 (增加一行)
<!--Location tomcat1.zy.com/test 实际映射到 /code/admin目录中 -->
<Context docBase="/code/admin" path="/test" reloadable="ture" />
[root@web01 ROOT]# mkdir /code/admin
[root@web01 ROOT]# echo "context testing is OK" > /code/admin/index.html
[root@web01 ROOT]# /soft/tomcat/bin/shutdown.sh
[root@web01 ROOT]# /soft/tomcat/bin/startup.sh
4. Tomcat 管理页面
当我们点这三个按钮时状态码为403拒绝,然后提示需要在 conf/tomcat-user.xml 中添加角色以及密码
1. 1.配置角色,并新增用户关联角色
[root@web01 ~]# vim /soft/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="admin-gui,manager-gui"/>
2. 光配置完还不行,需要去增加一个网段白名单 默认只允许本地127网段访问
# 允许10网段访问该角色的资源 (项目仅127,所以要修改)
[root@web01 ~]# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
[root@web01 ~]# vim /soft/tomcat/webapps/manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh
5. 部署一个java博客(zrlog)
1、安装数据库
$ yum install mariadb mariadb-server -y
$ systemctl enable mariadb
$ systemctl start mariadb
2、创建项目库
$ mysql -uroot -e "create database zrlog charset utf8;"
$ grant all on zrlog.* to zrlog@'127.0.0.1' identified by '123456';
3、添加虚拟主机
$ vim /soft/tomcat/conf/server.xml
<Host name="zrlog.zy.com" appBase="/code/zrlog"
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>
4、准备站点目录并将代码拷贝至站点目录下
$ mkdir /code/zrlog && cd /code/zrlog
$ wget http://dl.zrlog.com/release/zrlog-2.1.11-99a5759-release.war?attname=ROOT.war&ref=index
$ mv zrlog-2.1.11-99a5759-release.war\?attname\=ROOT.war ROOT.war
5、重启tomcat(会自动解压并创建同名目录)
$ /soft/tomcat/bin/shutdown.sh
$ /soft/tomcat/bin/startup.sh
$ ls /code/zrlog/
logs ROOT ROOT.war
6、web访问 根据提示填写数据库及管理员信息
6. 拆分数据库
1. 准备新的数据库机器 并安装mariadb
# 新的机器上安装数据库(10.0.0.51)
yum install mariadb mariadb-server -y
systemctl enable mariadb
systemctl start mariadb
2. 备份原数据库数据
$ mysqldump -uroot -B zrlog >/tmp/zrlog.sql
$ scp /tmp/zrlog.sql 10.0.0.51:~
3. 新数据库 并导入备份数据 创建远程连接用户
$ mysql -e "source ~/zrlog.sql"
$ mysql -e "grant all on zrlog.* to zrlog@'%' identified by '123';"
4、停源库,配置程序连接新数据库
systemctl stop mariadb
[root@web01 ~]# cat /code/zrlog/ROOT/WEB-INF/db.properties
#This is a database configuration file
#Thu Aug 20 22:48:47 CST 2020
driverClass=com.mysql.cj.jdbc.Driver
user=zrlog
password=123456
jdbcUrl=jdbc\:mysql\://10.0.0.51\:3306/zrlog?characterEncoding\=UTF-8&allowPublicKeyRetrieval\=true&useSSL\=false&serverTimezone\=GMT
7. 扩展web 节点
# 10.0.0.8 web02
$ yum install java -y
$ mkdir /soft
# 将web01上的Tomcat 代码 以及zrlog代码拷贝至web02(zrlog代码包含了连接数据库的信息)
$ scp -rp /soft/apache-tomcat-9.0.37 root@10.0.0.8:/soft/
$ scp -rp /code root@10.0.0.8:/
8. 静态资源共享
1. 准备nfs服务器 并 配置
$ yum install nfs-utils -y
$ cat /etc/exports
/data/zrlog 10.0.0.0/24(rw,async,all_squash,anonuid=666,anongid=666)
2. 根据配置文件,做服务启动前的初始化
# 我习惯会将共享目录给www用户
$ mkdir /data/zrlog -p
$ groupadd -g 666 www
$ useradd -u 666 -g www
3. nfs 服务启动
$ systemctl start nfs
$ systemctl enable nfs
4. 客户端验证(每个web节点) 如果列出以下信息就证明成功了
$ yum install nfs-utils -y
$ show mount -e 10.0.0.31
Export list for 10.0.0.31.31:
/data/zrlog 10.0.0.0/24
5. 执行挂载操作(每个web节点)
$ mount -t nfs 10.0.0.31:/data/zrlog /code/zrlog/ROOT/attached/
.....自行加入开机自动挂载.......
9. 接入负载均衡
1. 准备lb服务器 并启动配置
$ yum install nginx -y
$ vim /etc/nginx/conf.d/proxy_zrlog.zy.com.conf
upstream zrlog {
server 10.0.0.7:8080;
server 10.0.0.8:8080;
}
server {
listen 80;
server_name zrlog.zy.com;
location / {
proxy_pass http://zrlog;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2. 重载nginx服务让配置生效
$ systemctl reload nginx
3. 访问测试(配置host劫持 web页面访问)
10.0.0.5 zrlog.zy.com
10. 实现全栈https
1. 生成证书(如果有这一步可以省去)
[root@lb01 ~]# mkdir /etc/nginx/ssl_key
[root@lb01 ~]# cd /etc/nginx/ssl_key
[root@lb01 ssl_key]# openssl genrsa -idea -out server.key 2048
Enter pass phrase for server.key:1234
Verifying - Enter pass phrase for server.key:1234
[root@lb01 ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
2. 部署证书
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 443 ssl;
server_name zrlog.zy.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://zrlog;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name zrlog.zy.com;
return 302 https://$server_name$request_uri;
}
11. 基于 redis 实现会话保持
zrlog 的session存储在数据库中,所以不实现zrlog的会话共享了
11.1 准备测试代码 (先看下没有实现session绘画共享的效果)
1. 创建测试站点(web01、web02)
<!--session测试站点-->
<Host name="session.zy.com" appBase="/code/session"
unpackWARs="true" autoDeploy="true">
</Host>
2. 创建站点目录,放入测试代码
[root@web01 ~]# mkdir /code/session/ROOT -p
[root@web01 ~]# vim /code/session/ROOT/index.jsp
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("<br> web01 SESSION ID:" + session.getId() + "<br>");
out.println("Session created time is :" + session.getCreationTime()
+ "<br>");
%>
</body>
3.重启tomcat
/soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh
4. 接入负载均衡 host劫持 测试 (可以看到下图 是没有实现session会话共享的 )
11.2 实现会话共享
1. 准备新机器安装redis(可以在mariadb上)
yum install redis -y
2. 配置redis
[root@db01 ~]# grep "^[a-Z]" /etc/redis.conf
bind 127.0.0.1 172.16.1.51
requirepass 123456
3. web上安装redis-manager (每个web节点)
[root@web01 ~]# wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager.zip
[root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/* /soft/tomcat/conf/
4. 修改tomcat 配置文件 加以下两行内容
[root@web01 ~]# vim /soft/tomcat/conf/context.xml
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
5. 添加 redis连接信息
[root@web01 ~]# vim /soft/tomcat/conf/redis-data-cache.properties
redis.hosts=172.16.1.51:6379
redis.password=123456
6. 重启tomcat
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh