01.部署Tomcat
war包和jar包的区别?
| 特性 | JAR包 | WAR包 |
|---|---|---|
| 目标 | 通用java应用/库 | web应用程序 |
| 运行环境 | JVM | Servlet容器(Tomcat等) |
| 依赖管理 | 通常通过类路径 | WEB-INF/lib目录 |
| 入口点 | Main-Class清单属性 | web.xml或注解 |
| 包含web资源 | 否 | 是(JSP、HTML等) |
| 部署 | 独立运行 | 部署到web服务器 |
Tomcat官网
https://tomcat.apache.org/
https://tomcat.apache.org/
Tomcat11 依赖JDK17版本
Tomcat10 依赖JDK11版本
Tomcat9 依赖JDK8版本
1.web01部署
1.部署jdk
2.部署Tomcat
1.1.部署jdk
1.上传jdk8
[root@web01 ~]# ll jdk-8u181-linux-x64.rpm
-r-------- 1 root root 170023183 9月 27 2024 jdk-8u181-linux-x64.rpm
2.安装jdk8
[root@web01 ~]# rpm -ivh jdk-8u181-linux-x64.rpm
3.检查
[root@web01 ~]# rpm -qa|grep jdk
jdk1.8-1.8.0_181-fcs.x86_64
1.2.部署Tomcat
1.上传或官网下载Tomcat
[root@web01 ~]# ll apache-tomcat-9.0.113.tar.gz
-rw-r--r-- 1 root root 13049663 12月 3 03:56 apache-tomcat-9.0.113.tar.gz
2.解压即用 #企业中解压即用的包、经常放的位置(1.自定义目录 2./url/local)
#本次案例放/soft中
[root@web01 ~]# mkdir /soft
#解压到/soft
[root@web01 ~]# tar -xf apache-tomcat-9.0.113.tar.gz -C /soft/
[root@web01 ~]# ll /soft/
总用量 0
drwxr-xr-x 9 root root 220 5月 6 15:14 apache-tomcat-9.0.113
#名字太长做个软连接
[root@web01 ~]# ln -s /soft/apache-tomcat-9.0.113/ /soft/tomcat
[root@web01 ~]# ll /soft/
总用量 0
drwxr-xr-x 9 root root 220 5月 6 15:14 apache-tomcat-9.0.113
lrwxrwxrwx 1 root root 28 5月 6 15:15 tomcat -> /soft/apache-tomcat-9.0.113/
1.3.tomcat软件目录结构
bin ---主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)
conf ---tomcat配置文件的目录(站点配置:server.xml)
lib ---tomcat运行时需要加载的jar包
logs ---tomcat日志存放位置
temp ---tomcat临时存放文件路径
webapps ---tomcat默认站点目录
work ---tomcat运行时产生的缓存文件
1.4.运行Tomcat
[root@web01 bin]# ./startup.sh #相对路径启动Tomcat
[root@web01 bin]# /soft/tomcat/bin/startup.sh #绝对路径启动Tomcat
#启动
[root@web01 bin]# /soft/tomcat/bin/startup.sh
#检查
[root@web01 bin]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 6849/java
1.5.配置systemctl方式启动Tomcat
1.配置
[root@web01 bin]# cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/soft/tomcat/bin/startup.sh
ExecStop=/soft/tomcat/bin/shutdown.sh
ExecRestart=/soft/tomcat/bin/shutdown.sh && sleep2 && /soft/tomcat/bin/startup.sh
[Install]
WantedBy=multi-user.target
2.重新加载systemctl
[root@web01 bin]# systemctl daemon-reload
#扩展:Nginx启停方式两种
1.systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl status nginx
systemctl enable nginx
systemctl disable nginx
2.使用命令运行
/usr/sbin/nginx # 启动
/usr/sbin/nginx -s stop # 停止
/usr/sbin/nginx -s reload # 重新加载
#注意:同一时间只能用一种方式来管理启动方式要么是用命令、要么是用systemctl
#停止Tomcat
[root@web01 bin]# /soft/tomcat/bin/shutdown.sh
#使用systemctl运行Tomcat
[root@web01 bin]# systemctl start tomcat
[root@web01 bin]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 7147/java
02.Tomcat主配置文件
整体结构说明
server.xml 采用嵌套结构,从外到内定义了Tomcat的运行时容器:
Server -> Service -> Connector(s) + Engine -> Host -> Context
[root@web01 conf]# cat 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" />
<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"
maxParameterCount="1000"
/>
<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>
03.快速部署静态页面
1.配置虚拟主机
<!--复制一份Host自定义为diy.oldboy.com 代码目录指向/code/diy-->
[root@web01 conf]# vim server.xml
...
<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>
<Host name="diy.oldboy.com" appBase="/code/diy"
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>
2.重启生效
[root@web01 conf]# systemctl restart tomcat
3.hosts解析
10.0.0.7 diy.oldboy.com
4.测试访问

5.写点内容再次访问
[root@web01 conf]# mkdir /code/diy/ROOT
[root@web01 conf]# echo diy... > /code/diy/ROOT/index.html

04.Context
类似Nginx的location作用
#下面的context作用 如果访问diy.oldboy.com/tt 则给用户放回/code/tt下的内容
#注意如果context下的目录如果不提前创建、则Tomcat无法运行
<Host name="diy.oldboy.com" appBase="/code/diy"
unpackWARs="true" autoDeploy="true">
<Context docBase="/code/tt" path="/tt" reloadable="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>
[root@web01 conf]# netstat -tnulp|grep 8080
[root@web01 conf]# systemctl restart tomcat
[root@web01 conf]# netstat -tnulp|grep 8080
[root@web01 conf]# mkdir /code/tt
[root@web01 conf]# echo context... > /code/tt/index.html
[root@web01 conf]# cat /code/tt/index.html
context...
[root@web01 conf]# systemctl restart tomcat
[root@web01 conf]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 8281/java

05.管理自带的管理界面
Tomcat自带的管理页面
管理功能
监控功能
1.所有的管理页面,都将权限赋予给了角色,而角色的名称是固定的:manager-gui admin-gui
2.需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的页面
#将3行内容复制到倒数第1行的上面
tail -4 /soft/tomcat/conf/tomcat-users.xml
[root@web01 conf]# tail -4 /soft/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
</tomcat-users>
3.由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问:
[root@web01 conf]# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
[root@web01 conf]# vim /soft/tomcat/webapps/manager/META-INF/context.xml
默认状态:
allow="127.0.0.0/8,::1/128" />
修改后:
allow="10.0.0.0/8,::1/128" />

06.Tomcat部署zrlog博客
1.配置server
2.上传代码
3.配置数据库
4.走部署流程
1.配置server
1.配置
[root@web01 conf]# vim server.xml
...
<Host name="diy.oldboy.com" appBase="/code/diy"
unpackWARs="true" autoDeploy="true">
<Context docBase="/code/tt" path="/tt" reloadable="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>
<Host name="www.zrlog.com" appBase="/code/zrlog/"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="zrlog" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
2.重启生效
[root@web01 conf]# systemctl restart tomcat
[root@web01 conf]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 8555/java
2.上传代码
1.下载代码
[root@web01 conf]# cd /code/zrlog/
[root@web01 zrlog]# wget https://dl.zrlog.com/release/javax-war/zrlog.war
2.等待自动解压,修改名称为ROOT并删除war包
[root@web01 zrlog]# mv zrlog ROOT
[root@web01 zrlog]# rm -rf zrlog.war
3.创建数据库zrlog
[root@DB01 ~]# mysql -uroot -plzy123.com -e "create database zrlog;"
[root@DB01 ~]# mysql -uroot -plzy123.com -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wp |
| zh |
| zrlog |
+--------------------+
4.走部署流程

07.单台实现80访问Tomcat
1.配置Nginx代理
[root@web01 conf.d]# cat zrlog.conf
server {
listen 80;
server_name www.zrlog.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
}
}
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# systemctl restart nginx
2.访问测试

08.zrlog配置集群
1.web02部署jdk
2.web02部署Tomcat
3.将web01的代码同步到web02
4.配置systemctl启动方式
5.启动Tomcat
6.解析到10.0.0.8测试zrlog
7.负载均衡配置转发zrlog
1.web02部署jdk
1.从web01拷贝rpm包
[root@web02 ~]# scp 10.0.0.7:~/jdk* .
2.安装
[root@web02 ~]# rpm -ivh jdk-8u181-linux-x64.rpm
2.web02部署Tomcat
1.从web01拷贝Tomcat目录
[root@web01 soft]# rsync -avz --delete /soft/apache-tomcat-9.0.113 10.0.0.8:/soft/
2.做软连接
[root@web02 soft]# ln -s apache-tomcat-9.0.113 tomcat
[root@web02 soft]# ll
总用量 0
drwxr-xr-x 9 root root 220 5月 6 17:05 apache-tomcat-9.0.113
lrwxrwxrwx 1 root root 21 5月 6 17:07 tomcat -> apache-tomcat-9.0.113
3.将web01的代码同步到web02
[root@web02 ~]# scp -r 10.0.0.7:/code/zrlog /code/
[root@web02 ~]# ll /code/
总用量 12
drwxr-xr-x 13 apache apache 4096 4月 26 10:10 php
drwxr-xr-x 5 apache apache 4096 4月 26 09:10 wp
drwxr-xr-x 14 apache apache 4096 4月 26 09:22 zh
drwxr-x--- 3 root root 18 5月 6 17:08 zrlog
4.配置systemctl启动方式
[root@web02 ~]# scp 10.0.0.7:/usr/lib/systemd/system/tomcat.service /usr/lib/systemd/system/
Authorized users only. All activities may be monitored and reported.
root@10.0.0.7's password:
tomcat.service 100% 320 277.7KB/s 00:00
[root@web02 ~]# cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/soft/tomcat/bin/startup.sh
ExecStop=/soft/tomcat/bin/shutdown.sh
ExecRestart=/soft/tomcat/bin/shutdown.sh && sleep2 && /soft/tomcat/bin/startup.sh
[Install]
WantedBy=multi-user.target
[root@web02 ~]# systemctl daemon-reload
5.启动Tomcat
#注意:启动失败需要把下面这行删除或者创建这个目录
<Context docBase="/code/tt" path="/tt" reloadable="true" />
[root@web02 soft]# systemctl restart tomcat
[root@web02 soft]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 8275/java
6.hosts解析10.0.0.8测试zrlog
10.0.0.8 diy.oldboy.com www.zrlog.com
7.负载均衡配置转发zrlog
[root@lb01 conf.d]# cat zrlog.conf
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name www.zrlog.com;
location / {
proxy_pass http://zrlog;
include proxy_params;
}
}
8.测试访问
1.hosts解析
10.0.0.5 diy.oldboy.com www.zrlog.com
2.访问测试
www.zrlog.com
09.静态文件挂载NFS
1.找到图片的位置
http://www.zrlog.com/attached/thumbnail/20260506/20260506164539_57.png?h=371&w=660
2.配置NFS
[root@nfs ~]# vim /etc/exports
/data/wp 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zrlog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# mkdir /data/zrlog
[root@nfs ~]# chown www.www /data/zrlog/
[root@nfs ~]# systemctl restart nfs
3.将上传的图片拷贝到NFS
[root@web01 attached]# scp -r /code/zrlog/ROOT/attached/thumbnail/ 10.0.0.31:/data/zrlog/
4.挂载相应目录、如果没有上传attached目录不存在需要手动创建。
[root@web01 attached]# mount -t nfs 172.16.1.31:/data/zrlog /code/zrlog/ROOT/attached
[root@web01 attached]# df -h|grep zrlog
172.16.1.31:/data/zrlog 48G 3.8G 45G 8% /code/zrlog/ROOT/attached
[root@web02 ~]# df -h|grep zrlog
172.16.1.31:/data/zrlog 48G 3.8G 45G 8% /code/zrlog/ROOT/attached
#注意Nginx默认上传的限制
vim /etc/nginx/nginx.conf # 写在http区块即可 php也得改
client_max_body_size 20M;
10.Tomcat会话保持

1.配置web01
2.配置web02
3.负载均衡配置
4.部署Redis
1.配置web01
1.配置server
[root@web01 conf]# vim server.xml
...
<Host name="session.oldboy.com" appBase="/session/"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="session" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
...
[root@web01 conf]# systemctl restart tomcat
[root@web01 conf]# netstat -tnulp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 10272/java
2.站点目录配置
[root@web01 conf]# mkdir /session/ROOT
[root@web01 conf]# cat /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.浏览器测试访问
10.0.0.7 session.oldboy.com

2.配置web2
1.配置server
[root@web02 conf]# vim server.xml
...
<Host name="session.oldboy.com" appBase="/session/"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="session" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
...
[root@web02 conf]# systemctl restart tomcat
2.配置站点目录
[root@web02 conf]# mkdir /session/ROOT
[root@web02 conf]# cat /session/ROOT/index.jsp
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("<br> WEB2 SESSION ID:" + session.getId() + "<br>");
out.println("Session created time is :" + session.getCreationTime()
+ "<br>");
%>
</body>
3.浏览器访问测试
10.0.0.8 session.oldboy.com

3.负载均衡配置
1.配置server
[root@lb01 conf.d]# cat se.conf
upstream se {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name session.oldboy.com;
location / {
proxy_pass http://se;
include proxy_params;
}
}
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl restart nginx
1.浏览器访问测试
10.0.0.5 session.oldboy.com
刷新浏览器每次session id都会变好
4.部署Redis
1.服务端装Redis
2.客户端连接配置
4.1.服务端装Redis
前面案例已经部署
172.16.1.51:6379/123456
4.2.客户端连接配置
#上传zip包
1.上传第三方插件包
[root@web01 ~]# ll tomcat-cluster-redis-session-manager.zip
-rw-r--r-- 1 root root 921429 8月 25 2025 tomcat-cluster-redis-session-manager.zip
2.解压
[root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip
#配置插件修改默认的会话写入到Redis
3.拷贝jars到Tomcat的/lib目录中
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
4.拷贝conf下的redis.properties文件,到tomcat的conf文件
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/
5.将配置文件中连接Redis地址修改为如下地址即可
[root@web01 ~]# grep -E '172|123456' /soft/tomcat/conf/redis-data-cache.properties
redis.hosts=172.16.1.51:6379
redis.password=123456
6.添加如下两行至tomcat/conf/context.xml (添加在</Context> 上一行)
[root@web01 ~]# vim /soft/tomcat/conf/context.xml
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
#同步给web02
注意: 修改完一台直接和另外一台进行无差异同步rsync --delete
[root@web01 ~]# rsync -avz --delete /soft/apache-tomcat-9.0.113 10.0.0.8:/soft/
修改完成后重启Tomcat
[root@web02 conf]# systemctl restart tomcat
systemctl restart tomcat
#浏览器测试访问 session.oldboy.com session不会发生变化
正文完