目录
一. Tomcat概述
1.1 什么是Tomcat
Tomcat 是一个开源的 Java Servlet 容器 和 Web 服务器,由 Apache 软件基金会开发和维护。它实现了 Java EE(Jakarta EE) 中的 Servlet、JSP(JavaServer Pages)和 WebSocket 规范,是运行 Java Web 应用程序的核心环境之一。
1.2 安装Tomcat
注意:安装tomcat 前必须先部署JDK。
JDK(Java Development Kit,Java 开发工具包 是 Oracle 公司(原 Sun 公司)提供的 Java 开发核心工具包,用于 开发、编译和运行 Java 程序。它是 Java 生态系统的基石,包含 JRE(Java 运行时环境) 和 开发工具(如编译器、调试器)。)
1.2.1 CentOS7 安装
#在centos7-1上安装
cd /data/
#拖入Java开发工具包(JDK)和Tomcat服务器的压缩包
ls
tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
cd /usr/local
ls
ln -s jdk1.8.0_291/ jdk
#配置JDK的环境变量,让系统正确识别Java相关命令
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
#加载并执行 /etc/profile.d/jdk.sh 文件中的内容。
source /etc/profile.d/jdk.sh
#检查当前系统中安装的 Java 版本。
java -version
#创建一个符号链接(软链接)。
ln -s apache-tomcat-9.0.16/ tomcat
#创建一个名为 tomcat 的系统用户。
useradd tomcat
#更改目录及其内容的所属用户和组。
chown tomcat:tomcat apache-tomcat-9.0.16/ -R
#定义 Tomcat 服务的运行方式
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
Environment=PATH=$PATH:$JAVA_HOME/bin
Environment=CLASSPATH=/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=JAVA_HOME=/usr/local/jdk
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/jdk/bin
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start tomcat
systemctl status tomcat
1.2.2 ubuntu 安装
#在ubuntu 1上安装
cd /opt/
#拖入Java开发工具包(JDK)和Tomcat服务器的压缩包
ls
tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
cd /usr/local
ls
ln -s jdk1.8.0_291/ jdk
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
source /etc/profile.d/jdk.sh
java -version
useradd tomcat
chown tomcat:tomcat apache-tomcat-9.0.16/ -R
ln -s apache-tomcat-9.0.16/ tomcat
ls
vim /usr/lib/systemd/system/tomcat.service
After=syslog.target network.target
[Service]
Type=forking
Environment=PATH=$PATH:$JAVA_HOME/bin
Environment=CLASSPATH=/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=JAVA_HOME=/usr/local/jdk
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/jdk/bin
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start tomcat
systemctl status tomcat
1.2.3 使用脚本快速安装
centos7-2
cd /data/
#拖入拖入Java开发工具包(JDK)Tomcat服务器的压缩包和运行脚本
#运行脚本
bash install_tomcat_.sh
systemctl status tomcat
二. 配置文件及核心组件
2.1 配置文件
2.1.1 安装目录下文件介绍
目录名字 | 功能 |
---|---|
bin | 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 |
conf | 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。 |
lib | 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包 |
logs | 存放 Tomcat 日志 catalina.out比较常使用 |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 存放项目资源的目录 |
work | Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
2.1.2 conf子目录
文件名 | 说明 |
---|---|
server.xml | 主配置文件 全局生效 |
web.xml | 每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件 |
tomcat-users.xml | 用户认证的账号和密码文件 |
catalina.policy | 当使用security选项启动omcat时,用于为tomcat设置安全策略 |
catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
注意配置文件对于大小写敏感 |
2.2 组件
(1) Server
作用:Tomcat 的顶级容器,代表整个 Tomcat 实例。
功能:管理所有其他组件(如 Service 和 Connector)的生命周期。
(2) Service
作用:将 Connector 和 Engine 组合在一起,形成一个完整的服务。
功能:一个 Server 可以包含多个 Service,每个 Service 可以独立运行。
(3) Connector
作用:负责处理客户端请求并将其传递给 Engine。
功能:支持多种协议(如 HTTP、HTTPS、AJP)。
示例:
HTTP/1.1 Connector:处理 HTTP 请求。
AJP Connector:处理 Apache HTTP Server 与 Tomcat 之间的通信。
(4) Engine
作用:处理所有请求的核心组件。
功能:管理多个 Host(虚拟主机)并决定将请求路由到哪个 Host。
(5) Host
作用:代表一个虚拟主机,用于托管多个 Web 应用程序。
功能:每个 Host 可以包含多个 Context(Web 应用程序)。
示例:默认的
localhost
Host。
(6) Context
作用:代表一个 Web 应用程序。
功能:管理应用程序的资源(如 Servlet、JSP、静态文件)。
示例:每个 WAR 文件部署后会生成一个 Context。
(7) 内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
(8) 集群类组件
listener、cluster
三. tomcat 处理请求过程
假设来自客户的请求为: http://localhost:8080/test/index.jsp 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
Engine获得请求192.168.91.100:8080/test/index.jsp,遍历它所有虚拟主机Host
Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
Host匹配到路径为/test的Context
path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet path = alias
Context匹配到URLPATTERN为*.jsp的Sservlet,对应于]spServlet类构造HtpServletRequest对象和HttpServletResponse对象,作为参数调用)spSer let的doGet或doPost方法。
Context把执行完了之后的HttpServletResponse对象返回给Host
Host把HttpServletResponse对象返回给Engine
Engine把HttpServletResponse对象返回给Connector
Connector把HttpServletResponse对象返回给浏览器端
四. 常见配置详解
4.1 主页文件的优先级
Tomcat 会按照 <welcome-file> 的顺序依次查找文件。
如果找到第一个文件(如 index.html),则返回该文件作为响应。
如果第一个文件不存在,则继续查找第二个文件(如 index.htm),依此类推。
如果所有文件都不存在,Tomcat 会返回目录列表(如果目录列表功能已启用)或返回 404 错误。
vim /usr/local/tomcat/conf/web.xml
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
假设用户访问 http://localhost:8080/app/:
Tomcat 首先查找 index.html。
如果 index.html 存在,则返回该文件。
如果不存在,继续查找 index.htm。
查找 index.htm。
如果 index.htm 存在,则返回该文件。
如果不存在,继续查找 index.jsp。
查找 index.jsp。
如果 index.jsp 存在,则返回该文件。
如果不存在,Tomcat 返回目录列表或 404 错误。
4.2 状态页
在 Tomcat 中,"状态页"(Status Page)通常指的是 Tomcat 提供的用于监控服务器运行状态的页面。这些页面可以显示服务器的运行信息,如连接数、线程池状态、内存使用情况等。
4.2.1 开启状态页(只能在本机登录)
默认的管理页面被禁用,启用方法如下
cd /usr/local/tomcat/conf
vim tomcat-users.xml
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
systemctl restart tomcat
systemctl status tomcat
4.2.2 开启允许远程状态页
cd /usr/local/tomcat/webapps/manager
ls
cd META-INF
vim context.xml
systemctl restart tomcat
4.3 常见的端口
8080: 默认接收 http 请求的端口
8005: 安全端口,可以关闭tomcat
8009: apache 和 tomcat 联动 AJP 协议
五. 虚拟主机配置
Tomcat 的虚拟主机(Virtual Host)配置是为了支持在同一台服务器上运行多个独立的网站或应用程序,每个网站或应用程序可以拥有不同的域名、文件路径和配置。
配置步骤如下:
centos7-1
ls /usr/local/tomcat/webapps/
cd /data/
rm -rf *
mkdir -pv web{1,2,3}/ROOT
echo "web1 www.a.com" > web1/ROOT/index.html
echo "web2 www.b.com" > web2/ROOT/index.html
echo "web3 www.c.com" > web3/ROOT/index.html
cat web1/ROOT/index.html
vim /usr/local/tomcat/conf/server.xml
systemctl restart tomcat
centos7-2
vim /etc/hosts
192.168.52.101 nodel www.a.com www.b.com www.c.com
curl www.a.com:8080
curl www.b.com:8080
curl www.c.com:8080
六. tomcat nginx 动静分离
6.1 配置单级反向代理
单级反向代理(Single-Level Reverse Proxy)是一种常见的网络架构设计,通常用于将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端。反向代理在客户端和后端服务器之间充当中间层,提供负载均衡、安全性、缓存等功能。
在配置虚拟主机的基础上:
客户机;192.168.52.105----------->uduntu
nginx服务器:192.168.52.31------->uduntu-1
tomcat服务器1:192.168.52.101---->centos7-1
tomcat服务器2:192.168.52.102---->centos7-2
centos7-2
yum install epel-release.noarch -y(不要手打,可能会出错,用tab补全)
yum install nginx -y
systemctl start nginx
vim /etc/nginx/nginx.conf
location / {
proxy_pass http://www.a.com:8080/;
}
nginx -t
systemctl restart nginx
curl www.a.com:8080
curl www.b.com:8080
curl www.c.com:8080
cd /usr/local/tomcat/webapps/ROOT
mv index.jsp index.jsp.bak
vim index.jsp
7-2 102
centos7-1
cd /usr/local/tomcat/webapps/ROOT
mv index.jsp index.jsp.bak
vim index.jsp
7-1 101
ubuntu-1
apt install nginx -y
systemctl start nginx
systemctl status nginx
cd /etc/nginx/
vim nginx.conf
include /etc/nginx/sites-enabled/*;(复制)
cd /etc/nginx/sites-enabled/
ls
ll
vim default
#添加以下内容
upstream tomcat {
server 192.168.52.101:8080;
server 192.168.52.102:8080;
}
location ~* \.jsp$ {
proxy_pass http;//tomcat;
}
nginx -t
systemctl restart nginx
cd /var/www/html/
vim index.html
ubuntu2204-1
ubuntu
curl 192.168.52.31/index.html
curl 192.168.52.31/index.jsp
6.2 多级反向代理
centos7
yum install epel-release -y
yum install nginx -y
systemctl start nginx
vim /etc/nginx/nginx.conf
upstream web {
server 192.168.52.103;
server 192.168.52.104;
}
location / {
proxy_pass http://web;
}
nginx -t
systemctl restart nginx
7-13
yum install epel-release -y
yum install nginx -y
systemctl start nginx
cd /usr/share/nginx/html
ls
echo "i come from 7-13" > index.html
cat index.html
vim /etc/nginx/nginx.conf
location -* |.jsp$ {
proxy_pass http://192.168.52.101:8080;
}
nginx -t
systemctl restart nginx
7-14
yum install epel-release -y
yum install nginx -y
systemctl start nginx
cd /usr/share/nginx/html
echo "i come from 7-14" > index.html
cat index.html
vim /etc/nginx/nginx.conf
location -* |.jsp$ {
proxy_pass http://192.168.52.102:8080;
}
nginx -t
systemctl restart nginx
7-11
使用上述脚本快速安装tomcat
systemctl status tomcat
cd /usr/local/tomcat/webapps/ROOT
echo " i come from 7-11 " > test.jsp
7-12
使用上述脚本快速tomcat 安装
systemctl status tomcat
cd /usr/local/tomcat/webapps/ROOT
echo " i come from 7-12 " > test.jsp
192.168.52.107/test.jsp
七. 实现Java项目
7.1 自建博客
#在centos7-1上安装
cd /usr/local/tomcat/webapps
#将jpress-v3.2.1.war文件拖入其中
ln -s jpress-v3.2.1 jpress
cat >/etc/yum.repos.d/mysql.repo <<EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
EOF
yum -y install mysql-community-server
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -u root -p'自己的密码'
set global validate_password_policy=0;
set global validate_password_length=1;
#修改密码策略
alter user root@'localhost' identified by 'abc123';CREATE DATABASE blog;
GRANT all ON blog.* TO 'bloguser'@'%' IDENTIFIED BY 'admin123';
GRANT all ON blog.* TO 'bloguser'@'localhost' IDENTIFIED BY 'admin123';
flush privileges;