Tomcat部署及优化
Tomcat 一款JAVA开发的开源Web网站应用程序
1.Tomcat
使用场景:
作为Web服务器,处理静态网页请求,如html页面,但是性能一般(只有nginx的六分之一);
作为Servlet/JSP容器,运行JAVA语言开发的jsp动态网页程序,并作为中间件实现前端Web和后端数据库的协同工作,这也是tomcat的主要应用场景。
(1)Tomcat 核心的组件
(1)Web 容器:完成 Web 服务器的功能。
(2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
(3)JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。
Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户的.jsp动态页面的请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
(2)Tomcat 功能组件结构
(1)connect连接器
暴露监听端口(默认为8080),接收客户端发来的请求和返回响应消息给客户端
(2)conntainer容器
负责处理用户请求页面的业务逻辑。由4个子容器 engine、host、context、wrapper(servlet) 组成(它们是父子关系)
子容器 | |
---|---|
engine | 引擎,管理多个虚拟主机,一个container只有一个engine |
host | 一个host代表一个虚拟主机站点 |
context | 管理web网页应用程序 |
wrapper | servlet封装器,负责处理业务逻辑,对象实例的创建、执行、销毁等动作 |
2.Tomcat安装部署
(1)先安装 JDK
#### yum安装 ####
#yum安装
cd /mnt/Packages/
ls | grep -i java
yum install -y java-1.8.0-*
java -version
##清除之前的jdk
yum remove -y java-1.8.0-*
yum remove -y java-1.7.0-*
java -version
#### 软件包安装 ####
cd /opt/
rz -E 上传软件包
jdk-8u391-linux-x64.rpm
jdk-8u391-linux-x64.tar.gz
##解压JDK软件包
rpm包在/usr/lib/jvm/jdk-8u391-linux-x64目录中
rpm -qpl jdk-8u391-linux-x64.rpm
tar自己指定目录
tar xf jdk-8u391-linux-x64.tar.gz
ls
mv jdk1.8.0_391/ /usr/local/
cd /usr/local/
ls
cd jdk1.8.0_391/
ls
获取JDK安装目录,在/etc/profile文件里设置相关的环境变量 JAVA_HOME JRE_HOME CLASSPATH PATH
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_391
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
使用 source /etc/profile 加载配置
source /etc/profile
java -version
##验证jdk环境是否安装成功
cd ~
vim hello.java
public class hello {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
javac hello.java
ls
java hello
(2)再安装启动Tomcat
cd /opt/
rz -E 上传软件包
apache-tomcat-9.0.16.tar.gz
##解压 tomcat 软件包
tar xf apache-tomcat-9.0.16.tar.gz
ls
mv apache-tomcat-9.0.16 /usr/local/tomcat
cd /usr/local/
ls
cd tomcat/
ls
##启动 tomcat 进程
cd bin/
./startup.sh
netstat -lntp | grep 8080
##关闭tomcat
./shutdown.sh
netstat -lntp | grep 8080
http://20.0.0.140:8080
##后台启动
tomcat目录/bin/startup.sh
tomcat目录/bin/catalina.sh start
##前台启动
tomcat目录/bin/catalina.sh run
##关闭tomcat
tomcat目录/bin/shutdown.sh
使用 systemctl(/usr/lib/systemd/system/tomcat.service) 或 superviosrctl(/etc/supervisord.d/tomcat.conf)来管理 tomcat 服务运行状态
(1)systemctl
cd /usr/lib/systemd/system
vim tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk1.8.0_391"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl restart tomcat.service
systemctl enable tomcat.service
netstat -lntp | grep 8080
systemctl stop tomcat.service
netstat -lntp | grep 8080
(2)superviosrctl
yum install -y supervisor
yum install -y epel-release
(1)优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改
3.虚拟主机配置
(1)Tomcat虚拟主机配置
1)在 webapps 目录准备好各个虚拟主机站点使用的网页目录和测试网页文件
2)修改tomcat主配置文件 server.xml ,在 Engine 配置段下面添加多个 Host 配置段,并设置不同的虚 拟机的配置参数(name="站点主机名" appBase="webapps")
在每个 Host 配置段下面添加 Context 配置段,并设置每个虚拟主机所使用的网页程序的配置参数(docBase="webapps/XXX" path="")
(1)name:主机名
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文件执行有效性检验
(2)Context
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
修改 Tomcat 主配置文件 vim /usr/local/tomcat/conf/server.xml
<Host name="www.xlb666.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xlb666" path="" reloadable="true" />
</Host>
<Host name="www.xlb888.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xlb888" path="" reloadable="true" />
</Host>
4.Tomcat多实例部署
(1)Tomcat的端口
tcp 8080 负责接收http请求连接的端口
8443 负责接收https请求连接的端口
8005 用于接收关闭tomcat服务信号的端口
8009 AJP协议端口,用于与Apache连接使用的端口
修改tomcat主配置文件 server.xml 中的三个端口号 8080 8005 8009,每个实例要不一样
修改tomcat2启动停止脚本 startup.sh shutdown.sh ,添加环境变量export TOMCAT_HOME CATALINA_HOME CATALINA_BASE 都指向每个实例各自的工作目录
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat
启动各tomcat中的/bin/startup.sh
5.Tomcat优化
Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。
vim /usr/local/tomcat/conf/server.xml
minSpareThreads="100"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="500"
maxThreads="1000"
processorCache="1000"
URIEncoding="UTF-8"
maxKeepAliveRequests="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"/>
ps -T -p <PID> 查看指定线程
系统内核优化:
/etc/sysctl.conf 内核参数配置文件
#用于解决系统存在大量TIME WAIT状态连接的问题
net.ipv4.tcp_syncookies=1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse=1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout=30 修改MSL值,系统默认的TIMEOUT时间
#如果连接数本身就很多,可再优化TCP的可用端口范围,进一步提升服务器的并发能力
net.ipv4.tcp_keepalive_time=1200 #当keepalive启用时,TCP发送keepalive探测消息的频率,确认客户端是否断网
net.ipv4.ip_local_port_range=1024 65535 #用于向外连接的端口范围。缺省情况下很小,为32768 60999
net.ipv4.tcp_max_syn_backlog=8192 #SYN队列长度,默认为1024,加大队列长度为8192,可容纳更多等待连接的网络连接数
net.ipv4.tcp_max_tw_buckets=5000 #表示系统同时保持TIME WAIT的最大数量
net.core.somaxconn=65535 #一个端口能够监听的最大连接数
#如果需要IP路由转发
net.ipv4.ip_forward=1
JVM(java虚拟机)优化
修改 bin/catalina.sh 文件,在 cygwin=false 位置前面添加 JAVA_OPTS 参数
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -Xmn768m -XX:ParallelGCThreads=2 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof"
-server 表示启用JDK的Server模式,使多核服务器CPU性能更佳
-Xms2048m -Xmx2048m
设置JVM堆内存初始值和最大值,设置为一样大,一般为物理内存的1/2,最大不超过32G
设置为一样大的目的为减少GC次数和在java垃圾回收机制清理完堆区内存后不需要重新计算堆区内存的大小而浪费资源
-XX:PermSize=1024m -XX:MaxPermSize=1024m
设置非堆内存初始值和最大值,设置为一样大,一般为物理内存的1/4
设置为一样大的目的为减少内存伸缩带来的频繁内存申请,从而减少一定的系统开销
-Xmn768m 设置JVM堆内存新生代的大小,一般为堆内存的3/8
-XX:ParallelGCThreads=2 设置并行GC垃圾回收的线程数,提高垃圾回收效率,一般为CPU的数量相同
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof 设置JAVA应用进程发生OOM异常退出进行DUMP备份以及指定DUMP备份文件的保存路径