Tomcat部署步骤

安装JDK

方法一

删除原有java
yum remove -y java*

查看有无java
java -version

将java文件移入/opt
jdk-8u391-linux-x64.rpm  

更新java
rpm -ivh jdk-8u391-linux-x64.rpm

查看版本
java -version

方法二

删除原有java
yum remove -y java*

查看有无java
java -version

将java文件移入/opt
cd /opt
jdk-8u391-linux-x64.tar.gz

解压
tar -xf jdk-8u391-linux-x64.tar.gz

mv jdk1.8.0_391/ /usr/local/

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/profil

查看版本
java -version

安装Tomcat

将tomcat安装包移入/opt
cd /opt
apache-tomcat-9.0.16.tar.gz

解压
tar xf apache-tomcat-9.0.16.tar.gz


mv apache-tomcat-9.0.16 /usr/local/tomcat

cd /usr/local/tomcat/bin/

开启服务
./startup.sh
或
./catalina.sh start
或
./catalina.sh run     # 前台显示

查看端口
netstat -lntp | grep 8080

关闭服务
./shutdown.sh

配置文件
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"
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  #启动
systemctl enable tomcat   #配置自启
systemctl stop tomcat     #停止服务
systemctl status tomcat   #检测状态

tomcat的端口

tcp/8080   负责接收http请求连接的端口
    8005   用于接收关闭tomcat服务信号的端口
	8009   AJP协议端口,用于tomcat与apache连接使用的端口
    8443   负责接收https请求连接的端口(默认未开启)

启动tomcat进程

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

后台启动    tomcat目录/bin/startup.sh       tomcat目录/bin/catalina.sh start
前台启动    tomcat目录/bin/catalina.sh run
关闭        tomcat目录/bin/shutdown.sh
使用 systemctl(/usr/lib/systemd/system/tomcat.service)或 supervisorctl(/etc/supervisord.conf) 管理 tomcat 服务运行状态

虚拟主机配置

1)在 webapps 目录准备号各个虚拟主机站点使用的网页目录和网页文件
2)修改tomcat配置文件 server.xml,在Engine配置段下面添加多个Host配置段,并设置不同的虚拟主机的配置参数(name="站点域名" appBase="webapps")
在每个Host配置段下面添加Context配置段,并设置每个虚拟主机所使用的Web应用程序的配置参数(docBase="网页根目录" path="")

1.创建 01 和 02 项目目录和文件(两个host)

mkdir /usr/local/tomcat/webapps/01
mkdir /usr/local/tomcat/webapps/02
echo "This is 01 page\!" > /usr/local/tomcat/webapps/01/index.jsp
echo "This is 02 page\!" > /usr/local/tomcat/webapps/02/index.jsp

2.修改 Tomcat 主配置文件 server.xml

vim /usr/local/tomcat/conf/server.xml

插入
<Host name="www.01.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/01" path="" reloadable="true" />
</Host>

<Host name="www.02.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/02" path="" reloadable="true" />
</Host>

Host
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文件执行有效性检验

Context
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;

reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false

客户端浏览器访问验证

echo "虚拟机IP www.01.com www.02.com" >> /etc/hosts

浏览器访问 http://www.01.com:8080/   页面显示This is 01 page\! 
浏览器访问 http://www.02.com:8080/   页面显示This is 02 page\!

HTTP 请求过程

(1)Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是 www.01.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
(3)访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/01 目录,解析 index.jsp 并返回。

tomcat多服务实例

1)修改tomcat配置文件 server.xml 中的端口配置 8080  8005  8009,每个服务实例使用的端口要求不同
2)修改tomcat启停脚本 startup.sh  shutdown.sh,添加环境变量 export TOMCAT_HOME   CATALINA_HOME  CATALINA_BASE  分别指向各自服务实例的工作目录
3)启动tomcat进程

tomcat优化

配置文件优化

修改tomcat主配置文件 server.xml 中的连接器配置 <Connector port=“8080” protocol=“HTTP/1.1” … />

maxThreads(最大线程数/并发数) 通常设置为 1000
minSpareThreads(最小空闲线程数) 通常设置为 50或100
processorCache(进程缓冲器) 同 maxThreads 的值
acceptCount(等待队列数) 同 maxThreads 的值
enableLookups(关闭DNS反向查询) 设置为 false
URIEncoding(网页URL字符集编码) 设置为 UTF-8
connectionTimeout(长连接超时时间) 通常设置为 20000或30000
maxKeepAliveRequests(长连接最大请求数) 通常设置为 100

disableUploadTimeout(关闭上传超时) 通常设置为 true
compression(网页压缩) 通常设置为 on

系统内核优化

/etc/security/limits.conf 系统资源限制优化
  • soft nofile 65535 #进程打开文件数 ulimit -n
  • hard nofile 65535
  • soft nproc 65535 #打开的系统进程数 ulimit -u
  • hard nproc 65535
/etc/sysctl.conf 内核参数配置优化

#解决TIME_WAIT数量过多问题
net.ipv4.tcp_tw_reuse=1 开启TIME_WAIT连接重用于新的TCP连接
net.ipv4.tcp_tw_recycle=1 开启TIME_WAIT连接快速回收,已废弃,高版本的内核此参数可能会导致连接问题
net.ipv4.tcp_max_tw_buckets=5000 设置系统可以处理的TIME WAIT连接的最大数量,默认值为16384
net.ipv4.tcp_fin_timeout=30 设置系统TCP连接关闭的超时时间(MSL),默认值为60,减少等待关闭连接的时间,尽快释放系统资源

#进一步优化本地的可用端口范围,提升服务器的并发能力,还能适当预防syn flood攻击
net.ipv4.ip_local_port_range=1024 65535 设置系统用于向外连接的本地端口范围,默认情况下范围很小,为32768 60999
net.ipv4.tcp_keepalive_time=1200 设置发送keepalive探测包确认客户端是否断网的间隔时间,默认值为7200秒

net.ipv4.tcp_max_syn_backlog=32768 设置系统能接受的tcp半连接状态的最大队列长度,TCP三次握手建立阶段接受SYN请求队列的最大长度,默认值为128
net.core.netdev_max_backlog=16384 设置网络接口接收数据包的最大队列长度,默认值为1000
net.core.somaxconn=16384 设置系统中每个端口允许的最大监听队列长度,默认值为128

net.ipv4.tcp_syncookies=1 开启SYN Cookies功能,可以适当预防syn flood攻击
net.ipv4.tcp_synack_retries=2 设置发起syn+ack的最大重试次数,默认为5,可以适当预防syn flood攻击

net.ipv4.ip_forward=1 开启IP数据包转发功能

JVM优化

修改 bin/catalina.sh 文件,在 cygwin=false 位置前面添加 JAVA_OPTS 参数

以 2C4G 的服务器规格为例:
JAVA_OPTS=“$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -Xmn768m”

-server 表示启动JDK的server模式,使多核服务器CPU性能更佳

-Xms2048m -Xmx2048m 设置JVM堆内存初始值和最大值,设置为相同大小,一般为物理内存的1/2,最大不超过32G
Xms和Xmx设置相同大小的目的为减少GC次数,以及在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区内存的大小而浪费资源

-Xmn768m 设置JVM堆内存新生代的大小,一般为堆内存的3/8

-XX:PermSize=1024m -XX:MaxPermSize=1024m 设置非堆内存初始值和最大值,设置为相同大小,一般为物理内存的1/4

-XX:ParallelGCThreads=2 设置并行GC(JAVA垃圾回收)的线程数,提高垃圾回收的效率,一般为与CPU的数量相同

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=“/usr/local/tomcat/temp/oom.hprof” 设置JAVA应用进程发送OOM异常退出时进行DUMP备份以及指定DUMP备份文件的保存路径

网站压测

ab  -c 并发连接数  -n 请求总数  -t 最大测试时间   http://域名/URL路径       #常用于测试网站每秒处理的连接数和请求数的性能

jmeter      #用于测试访问网站静态、动态资源的请求响应性能
Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!