Tomcat部署与优化

Tomcat部署与优化

Tomcat简述

server: 服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个

service:服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine

connector:连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine

Engine:即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector

Host:即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分

Context:应用的上下文,配置特定url路径映射和目录的映射关系: url => directory

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

  • Context匹配到URLPATTERN为*.jsp的Sservlet,对应于]spServlet类构造HtpServletRequest对象和HttpServletResponse对象,作为参数调用)spSer let的doGet或doPost方法。

  • Context把执行完了之后的HttpServletResponse对象返回给Host

  • Host把HttpServletResponse对象返回给Engine

  • Engine把HttpServletResponse对象返回给Connector

  • Connector把HttpServletResponse对象返回给浏览器端

Tomcat部署

安装JDK

bash 复制代码
#关闭防火墙和selinux
systemctl disable firewalld --now
setenforce 0
 
#将源代码包置于/opt下
apache-tomcat-9.0.16.tar.gz 
jdk-8u201-linux-x64.rpm

#安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm 

#确定安装路径
rpm -ql jdk1.8 | tail -n 1

cd /usr/java/jdk1.8.0_201-amd64/;ls 

#查看JDK版本
java -version 

#设置JDK环境变量
vim /etc/profile
#添加环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile#刷新配置文件

#安装Tomcat并用systemd启动
#解压tomcat安装包
cd /opt
tar zxf apache-tomcat-9.0.16.tar.gz   
#简化路径,方便管理
mv apache-tomcat-9.0.16 /usr/local/tomcat
#启动Tomcat的方法,省略路径
startup.sh          #后台启动tomcat
catalina.sh start   #后台启动tomcat
catalina.sh run     #前台启动 tomcat
#关闭Tomcat的方法:
shutdown.sh
#查看tomcat是否启动:
netstat ss ps jps
添加到supervisord服务
bash 复制代码
#安装源和服务
yum install -y epel-release
yum install -y supervisor

#建立管理用户
useradd tomcat
chown -R tomcat:tomcat /usr/local/tomcat
#编辑住配置文件
vim /etc/supervisord.conf

vim /etc/supervisord.d/tomcat.conf

[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run  ;程序启动命令
autostart=true          ;在supervisord启动的时候也自动启动
startsecs=10            ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true        ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3          ;启动失败自动重试次数,默认是3
user=tomcat             ;用哪个用户启动进程,默认是root
priority=999            ;进程启动优先级,默认999,值小的优先启动
redirect_stderr=true    ;把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=200MB    ;stdout 日志文件大小,默认50MB
stdout_logfile_backups=20        ;stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/var/log/supervisor/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

mkdir -p /var/log/supervisor/logs #创建日志路径

systemctl start  supervisord  #启动服务
systemctl enable supervisord #开机自启

#启动方式二
#supervisord -c /etc/supervisord.conf 

supervisorctl reread #重新加载 Supervisor 的配置
supervisorctl update #应用新的配置

supervisorctl start tomcat
supervisorctl status tomcat
Tomcat的端口和主要目录

Tomcat端口

8080: 默认接收 http 请求的端口

8005: 安全端口,可以关闭tomcat

8009: apache 和 tomcat 联动 AJP 协议

8443:负责处理https请求连接

主要目录

目录名字 功能
bin 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.shstartup.shshutdown.sh
conf 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件
lib 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包
logs 存放 Tomcat 日志
temp 存放 Tomcat 运行时产生的文件
webapps 存放项目资源的目录
work omcat 工作目录,一般清除 Tomcat 缓存的时候会使用到

conf子目录

文件名 说明
server.xml 主配置文件 全局生效
web.xml 每个webapp只有"部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件
context.xm 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件
tomcat-users.xml 用户认证的账号和密码文件
catalina.policy 当使用security选项启动omcat时,用于为tomcat设置安全策略
catalina.properties Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.properties Tomcat日志系统相关的配置,可以修改日志级别和日志路径等
Tomcat虚拟机
bash 复制代码
#创建项目目录和文件
mkdir /usr/local/tomcat/webapps/ck1
mkdir /usr/local/tomcat/webapps/ck2

echo "This is ck1\!" > /usr/local/tomcat/webapps/ck1/index.jsp

echo "This is ck2\!" > /usr/local/tomcat/webapps/xhz/index.jsp

#修改Tomcat主配置文件server.xml
vim /usr/local/tomcat/conf/server.xml

#165行前插入
 <Host name="www.a.com"  appBase="/usr/local/tomcat/webapps/ck1"
            unpackWARs="true" autoDeploy="true">
      </Host>
      <Host name="www.b.com"  appBase="/usr/local/tomcat/webapps/ck2"
            unpackWARs="true" autoDeploy="true">
      </Host>


#重新启动
supervisorctl restart tomcat

在本机的hosts文件中添加

192.168.118.30www.a.com www.b.com

Tomcat优化

怎么查看线程数?

ss -natp | grep java 看pid

ps -T -p pid

配置文件优化

maxThreads (最大线程数/并发)

processorCache (进程缓冲)

acceptCount (等待队列数)

enableLookups (关闭DNS反向解析)

URIEncoding (网页字符集编码UTF-8)

maxKeepAliveRequests (长连接最大请求数)

connectionTimeout (连接超时时间)

compression (开启页面压缩)

系统内核优化

bash 复制代码
/etc/security/limits.conf 
nofile 
nproc  
memlock

/etc/sysct1.conf   
net .ipv4.tcp_tw_reuse=1   
net.ipv4.tcp_tw_recycle=1  
net.ipv4.tcp_fin_timeout=30  
net.ipv4.tcp_max_tw_buckets=5000              net.ipv4.ip_local_port_range=1024 65535

JVM优化

选项分类

  • -选项名称 此为标准选项,所有HotSpot都支持
  • -X选项名称 为稳定的非标准选项
  • -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消
参数 说明 举例
-Xms 设置应用程序初始使用的堆内存大小(年轻代+老年代) -Xms2g
-Xmx 设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降 -Xms4g
-XX:NewSize 设置初始新生代大小 -XX:NewSize=128m
-XX:MaxNewSize 设置最大新生代内存空间 -XX:MaxNewSize=256m
-Xmnsize 同时设置-XX:NewSize 和 -XX:MaxNewSize,代 -Xmn1g
-XX:NewRatio 以比例方式设置新生代和老年代 -XX:NewRatio=2 new/old=1/2
-XX:SurvivorRatio 以比例方式设置eden和survivor(S0或S1) -XX:SurvivorRatio=6 eden/survivor=6/1 new/survivor=8/1
-Xss 设置每个线程私有的栈空间大小,依据具体线程 -Xss256k
     |

| -XX:SurvivorRatio | 以比例方式设置eden和survivor(S0或S1) | -XX:SurvivorRatio=6 eden/survivor=6/1 new/survivor=8/1 |

| -Xss | 设置每个线程私有的栈空间大小,依据具体线程 | -Xss256k |

相关推荐
pk_xz12345641 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强43 分钟前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面5 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
wclass-zhengge8 小时前
Docker篇(Docker Compose)
运维·docker·容器
尢词8 小时前
SpringMVC
java·spring·java-ee·tomcat·maven