TOMCAT详细部署
- Tomcat服务器简介
- 核心组件
- Tomcat 各组件及关系
- 工作流程
- Tomcat server.xml 配置详解
- server
- service
- Connector
- Engine
- Host
- Context
- Valve 阀门
- Tomcat部署与安装
- 部署脚本
- 主要目录说明
- Tomcat多实例部署
- 扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数
Tomcat服务器简介
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。
概括:
1)免费的、开放源代码的Web应用服务器
2)Apache软件基金会(Apache Software Foundation)Jakarta项目中的一个核心项目
3)由Apache、Sun和一些公司及个人共同开发而成
4)深受Java爱好者的喜爱,并得到部分软件开发商的认可
5)目前比较流行的Web应用服务器
Apache和Tomcat的区别在于
- Apache是一个普通的HTTP服务器,主要用于静态网页的访问和处理。
- Tomcat是一个更强大的应用服务器,主要用于动态网页的访问和处理。
- Apache不能解释java程序(jsp,serverlet)。
- Tomcat支持HTML、JSP、ASP、PHP、CGI等。
- 在独立运行模式下,Tomcat的功能与Apache等效,支持JSP。
核心组件
1.Java Servlet
运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。与CGI(公共网关接口)功能相类似。
2.JSP全称Java Server Pages
一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。 JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
3.Tomcat三大核心组件
Tomcat 由一系列的组件构成,其中核心的组件有三个
Web容器:完成Web服务器的功能。
Servlet 容器:名字为catalina, 用于处理Servlet代码。
JSP容器:用于将JSP动态网页翻译成Servlet代码。
Tomcat 各组件及关系
-
Server 和 Service
-
Connector 连接器
- HTTP 1.1
- SSL https
- AJP( Apache JServ Protocol) apache 私有协议,用于apache反向代理Tomcat
-
Container
- Engine 引擎 catalina
- Host 虚拟机 基于域名 分发请求
- Context 隔离各个WEB应用 每个Context的 ClassLoader都是独立
-
Component
- Manager (管理器)
- logger (日志管理)
- loader (载入器)
- pipeline (管道)
- valve (管道中的阀)
工作流程
- 用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
- Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
- 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
- 执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
Tomcat server.xml 配置详解
server
root元素:server 的顶级配置 主要属性: port:执行关闭命令的端口号 shutdown:关闭命令
演示shutdown的用法 #基于telent 执行SHUTDOWN 命令即可关闭(必须大写) telnet 127.0.0.1 8005 SHUTDOWN
service
服务:将多个connector 与一个Engine组合成一个服务,可以配置多个服务。
Connector
连接器:用于接收 指定协议下的连接 并指定给唯一的Engine 进行处理。 主要属性:
protocol 监听的协议,默认是http/1.1
port 指定服务器端要创建的端口号
minSpareThreads服务器启动时创建的处理请求的线程数
maxThreads 最大可以创建的处理请求的线程数
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)
SSLEnabled 是否开启 sll 验证,在Https 访问时需要开启。生成证书: keytool -genkey -v -alias testKey -keyalg RSA -validity 3650
-keystore D:\test.keystore
[ ] 演示配置多个Connector
<Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8862"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"
maxThreads="1024" minSpareThreads="200"
acceptCount="800"
maxConnections="10000"
enableLookups="false"
/>
Engine
引擎:用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。 主要属性:name 引擎名称 defaultHost 默认host
Host
虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost.
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为
/usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于
appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
Context
应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。
Valve 阀门
可以理解成过滤器,具体配置要基于具体的Valve 接口的子类。以下即为一个访问日志的Valve
Tomcat部署与安装
部署脚本
#!/bin/bash
# 切换到/opt目录
cd /opt
# 安装Java Development Kit (JDK) 8
rpm -ivh jdk-8u371-linux-x64.rpm
# 向环境变量配置文件中添加Java环境变量
echo "export JAVA_HOME=/usr/java/jdk1.8.0-x64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH" >>etc/profile.d/java.sh
# 使环境变量配置立即生效
sourse /etc/profile.d/java.sh
# 切换到/opt目录,解压Apache Tomcat 9
cd /opt
tar zxvf apache-tomcat-9.0.78.tar.gz
# 将解压的Tomcat移动到/usr/local/tomcat下
mv -f apache-tomcat-9.0.78 /usr/local/tomcat
# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
# 检查Tomcat启动是否成功
if [ $? -eq 0 ]; then
echo "tomcat启动成功"
else
echo "tomcat启动失败"
fi
# 在Tomcat的webapps目录下创建kgc和benet应用目录
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
# 向kgc和benet应用目录下的index.jsp文件写入内容
echo "This is kgc page\!" >/usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" >/usr/local/tomcat/webapps/benet/index.jsp
# 更新Tomcat的server.xml配置文件,以添加对kgc和benet域名的配置
# 创建临时文件来存储更新后的配置
temp_file=$(mktemp)
# 使用sed命令将配置插入到临时文件中
sed "160a\\t<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">\n\t<Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true"\n\t/>\n\t</Host>\n\t<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">\n<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true"\n/>\n</Host>" /usr/local/tomcat/conf/server.xml >"$temp_file" &&
# 检查是否成功写入临时文件
if [ $? -eq 0 ]; then
# 在替换原始配置文件之前创建一个备份
cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.bak
# 替换原始配置文件
mv -f "$temp_file" /usr/local/tomcat/conf/server.xml &&
echo "Configuration updated successfully."
else
# 如果写入临时文件失败,记录错误消息并清理临时文件
echo "Failed to update configuration."
rm "$temp_file"
fi
# 重写kgc和benet应用目录下的index.jsp文件内容,确保内容是最新的
echo "This is kgc page\!" >/usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" >/usr/local/tomcat/webapps/benet/index.jsp
# 获取本地eth0网卡的IP地址,并将其与kgc和benet域名一起添加到hosts文件中
local_ip=$(ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d '/' -f 1)
echo "$local_ip www.kgc.com www.benet.com" >> /etc/hosts
# 停止并重新启动Tomcat,以确保配置和内容更新生效
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
# 验证kgc和benet应用是否可以通过域名访问
curl www.kgc.com:8080/kgc/index.jsp
curl www.benet.com:8080/benet/index.jsp
小知识
CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
dt.jar:是关于运行环境的类库,主要是可视化的 swing 的包。
tools.jar:主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等。
JDK :java development kit (java开发工具)
JRE :java runtime environment
(java运行时环境)
JVM :java virtual machine (java虚拟机),使java程序可以在多种平台上运行class文件。
主要目录说明
●bin:存放启动和关闭Tomcat的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
●conf:存放Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
① server.xml: Tomcat的主配置文件,包含Service,Connector,Engine,Realm,Valve,Hosts主组件的相关配置信息;
② context.xml:所有host的默认配置信息;
③ tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息,Tomcat自带的manager默认情况下会用到此文件,在Tomcat中添加/删除用户,为用户指|定角色等将通过编辑此文件实现;
④ web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的web应用程序提供包括MIME映射等默认配置信息;
●lib:存放Tomcat运行需要的库文件的jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的jar 包
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用部署目录
●work:Tomcat工作日录,存放jsp编译后产生的class文件,一般清除Tomcat缓存的时候会使用到
●src:存放Tomcat 的源代码
●doc:存放Tomcat文档
Tomcat多实例部署
#!/bin/bash
# 定义软件包名称和版本
jdk_package="jdk-8u371-linux-x64.rpm"
tomcat_package="apache-tomcat-9.0.78.tar.gz"
tomcat_version="9.0.78"
tomcat_base_dir="/usr/local/tomcat"
# 检查是否以root身份运行
if [ "$(id -u)" != "0" ]; then
echo "Please run as root."
exit 1
fi
# 检查软件包是否存在
if [ ! -f "/opt/${jdk_package}" ] || [ ! -f "/opt/${tomcat_package}" ]; then
echo "JDK or Tomcat package not found. Please make sure ${jdk_package} and ${tomcat_package} are in /opt."
exit 1
fi
# 安装JDK
rpm -ivh /opt/${jdk_package}
# 解压Tomcat
tar -xf /opt/${tomcat_package} -C /opt || { echo "Tomcat extraction failed."; exit 1; }
# 创建Tomcat目录并移动Tomcat
mkdir -p ${tomcat_base_dir} && mv -f /opt/apache-tomcat-${tomcat_version} ${tomcat_base_dir}/tomcat1
# 复制Tomcat实例
cp -a ${tomcat_base_dir}/tomcat1 ${tomcat_base_dir}/tomcat2 || { echo "Tomcat copy failed."; exit 1; }
# 编辑环境变量文件
echo "export CATALINA_HOME1=${tomcat_base_dir}/tomcat1
export CATALINA_BASE1=${tomcat_base_dir}/tomcat1
export TOMCAT_HOME1=${tomcat_base_dir}/tomcat1
#tomcat2
export CATALINA_HOME2=${tomcat_base_dir}/tomcat2
export CATALINA_BASE2=${tomcat_base_dir}/tomcat2
export TOMCAT_HOME2=${tomcat_base_dir}/tomcat2" | tee -a /etc/profile.d/tomcat.sh && source /etc/profile.d/tomcat.sh || { echo "Environment variables configuration failed."; exit 1; }
# 修改Tomcat配置文件
sed -i.bak -e '22s/<Server port="8005" shutdown="SHUTDOWN">/<Server port="8006" shutdown="SHUTDOWN">/g' \
-e 's/ port="8080" protocol="HTTP\/1.1">/ port="8080" protocol="HTTP\/1.1"/g' \
-e 's/ port="8009"/ port="8010" /g' \
$CATALINA_HOME2/conf/server.xml || { echo "Tomcat configuration failed."; exit 1; }
# 更新start.sh和shutdown.sh文件
for tomcat_instance in 1 2; do
cat <<EOF > ${tomcat_base_dir}/tomcat${tomcat_instance}/bin/start.sh
export CATALINA_BASE=\${CATALINA_BASE${tomcat_instance}}
export CATALINA_HOME=\${CATALINA_HOME${tomcat_instance}}
export TOMCAT_HOME=\${TOMCAT_HOME${tomcat_instance}}
EOF
cat <<EOF > ${tomcat_base_dir}/tomcat${tomcat_instance}/bin/shutdown.sh
export CATALINA_BASE=\${CATALINA_BASE${tomcat_instance}}
export CATALINA_HOME=\${CATALINA_HOME${tomcat_instance}}
export TOMCAT_HOME=\${TOMCAT_HOME${tomcat_instance}}
EOF
done
mkdir -p $CATALINA_HOME1/webapps/kgc
mkdir -p $CATALINA_HOME2/webapps/benet
echo "This is kgc page\!" >$CATALINA_HOME1/webapps/kgc/index.jsp
echo "This is benet page\!" >$CATALINA_HOME2/webapps/benet/index.jsp
# 启动Tomcat实例
${tomcat_base_dir}/tomcat1/bin/startup.sh || { echo "Tomcat 1 startup failed."; exit 1; }
${tomcat_base_dir}/tomcat2/bin/startup.sh || { echo "Tomcat 2 startup failed."; exit 1; }
echo "Tomcat 1 and Tomcat 2 started successfully."
扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数
通常情况下,catalina.sh 位于 Tomcat 安装目录的 bin 子目录下,如 /usr/local/tomcat/tomcat2/bin/catalina.sh
CATALINA_OPTS="-server \
-Xms2048m -Xmx2048m \
-Xmn512m \
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m \
-XX:NewRatio=3 \
-XX:SurvivorRatio=8 \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:InitiatingHeapOccupancyPercent=70 \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCCause \
-Xloggc:/var/log/tomcat/tomcat_gc.log \
-Djava.awt.headless=true \
-Dcom.sun.management.jmxremote.port=10086 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
-server: 启用服务器模式的 JVM。
-Xms 和 -Xmx: 分别设置堆的初始大小和最大大小,保持一致可以减少堆大小调整带来的开销。
-Xmn: 设置年轻代(Young Generation)大小。
-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize: 设置元空间(MetaSpace,取代了 PermGen)的初始和最大大小。
-XX:NewRatio: 设置老年代与年轻代的大小比例。
-XX:SurvivorRatio: 设置 Eden 区与 Survivor 区的大小比例。
-XX:+UseG1GC: 使用 G1 垃圾收集器,根据实际需求可选用其他适合的 GC 策略。
-XX:MaxGCPauseMillis: 设置期望的最大 GC 停顿时间。
-XX:InitiatingHeapOccupancyPercent: 设置触发并发标记周期的堆占用百分比。
-XX:+PrintGCDetails 等:开启详细的 GC 日志记录,便于分析和调优。
# 禁用显式gc
-XX:+DisableExplicitGC # 自动将System.gc() 调用转换成一个空操作,即应用中调用
System.gc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc()除
非是到了万不得已的情况下使用,都应该交给JVM。
-Xloggc: 设置 GC 日志文件路径。
-Djava.awt.headless=true: 防止在无图形界面环境中出现相关异常。
-Dcom.sun.management.jmxremote.*: 开启 JMX 远程监控,便于通过 JConsole 或其他工具监控 JVM 状态。