Tomcat部署以及优化

1、tomcat

tomcat是用java代码的程序,运行的是java的web服务器

tomcat和php一样都是用来处理动态页面,tomcat也可以做为web应用服务器,开源的

php处理.php为结尾的

tomcat 处理.jsp

nginx 处理 .html

2、tomcat的特点和功能

1、servlet容器:执行java servlet 服务端的java程序,处理客户端的http请求,以及响应。

servlet:是java语言当中用于开发web应用程序的关键组件。处理http请求,生成动态内容,以及响应客户端的请求。处理http请求,生成动态内容,处理java的业务逻辑,会话管理,保持用户的状态信息,购物车同步,用户登录等等。也可以转发nginx的动态请求到数据库。

2、jsp容器 javasever page,这是一种动态页面技术,可以在html页面里面嵌入java代码。

jsp:web应用程序的界面,这个界面的语言是用java来实现的.jsp为结尾的文件,index.jsp3、自身也是一个http的服务器

4、tomcat是一个轻量级的动态页面处理程序,高并发场景不使用。

3、tomcat的组件

tomcat可以有多个service,每个service之间互相独立的。

service:对外提供web服务,包含connector和container。

connector:负责对外接受和响应请求。它是tomcat与客户端沟通的一个枢纽,监听端口接受外界请求。

端口:8080。

接受到了请求之后,要传递给其他组件进行处理,处理完成之后要回到connector,在响应客户端。

container:用来负责处理业务逻辑,engine host context wrapper 四个功能组成。

engine:用来管理多个虚拟主机。一个service只能有一个engine。

host:一个host就是一个主机,也可以叫站点,通过配置host可以添加多个站点。

context:一个context代表代表一个web应用。

wrapper:封装器,负载处理最底层的逻辑。

4、tomcat目录的作用

bin 存放启动和关闭tomcat脚本的文件,starup.sh shutdown.sh。

conf 存放tomcat的主配置文件,server.xml主配置文件。

context.xml:存放host的配置信息。

tomcat-user.xml:登录时认证用户和密码的相关信息,manager文件必须要赋权修改之后才能打开。

lib:tomcat运行时需要jar包,一般不动。

logs:日志文件,catalina.out主日志文件。

temp:存放tomcat运行时产生的文件。

webapps:用来部署web应用的目录,类似于nginx的html。

5、Tomcat服务的部署

拖入两个包

1、搭建环境

关闭防火墙以及安全机制

systemctl stop firewalld
setenforce 0

2、 安装jdk环境

#某rpm包尚未安装,我们可以通过该命令查询其说明信息、安装以后会生成的文件;
rpm -qpl jdk-8u201-linux-x64.rpm 
 
#安装并以#显示安装进度以及显示详细过程
rpm -ivh jdk-8u201-linux-x64.rpm 
 
#查看jdk环境
java -version

 在/etc/profile.d/  目录下创建相关的 .sh 脚本,profile有默认调用的功能。

vim /etc/profile.d/java.sh
---------------------------------------------
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
wq

source /etc/profile.d/java.sh #生效环境
java -version
 

3、安装tomcat

cd /opt
#解压tomcat软件包
tar zxvf apache-tomcat-9.0.16.tar.gz
 
#移动至服务软件包统一管理目录中,并且简易其名称
mv apache-tomcat-9.0.16 /usr/local/tomcat

 测试功能,tomcat目录下的bin目录下控制tomcat的关闭与启动

[root@localhost bin]# ./shutdown.sh #关闭tomcat服务

[root@localhost bin]# ./startup.sh #开启tomcat服务

测试页面,默认端口是8080

6、  tomcat优化

tomcat优化:tomcat自身的优化、内核优化、jvm优化(开发优化)

tomcat的并发处理能力不强,大项目一般不使用转发动态的中间件(k8s集群,python,rubby),小项目会使用(内部使用)。

1、优化tomcat的启动速度

vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
-------------------------
set nu
117行
file:/dev/urandom #修改结果为异步非阻塞
重启

非阻塞的版本,不依赖系统的终端,进程忙也不会进入等待状态,所以处理速度相对较快,如果对应用的安全性要求比较高

2、默认配置不适合成产环境,可能频繁出现假死,需要不停的重启。 根据生产环境的实际 情况,自行测试。

vim server.xml
71行
#port 8080是http的端口 80
#8443 是https的端口 443
#接收客户端https的请求

优化线程
maxThreads="500" :tomcat使用线程来处理接收请求的个数,tomcat最多可以创建多少个线程。默认是200个500 1000
minSpareThreads="20":最小空闲数线程,tomcat开启之后,没人使用也会有进程待命,默认值是10
maxSparThrads:最大空闲数进程,一旦线程总数超过了这个值,tomcat就会关闭不再需要的线程。默认是-1,不限制,一般不设置
connectionTimeout="20000" 网络连接超时时间,单位的毫秒,设置成0,永不超时,默认即可。
enableLookups:是否支持反向解析,取值范围:true/false 一般都是关闭false,可以提高处理速度
disableUplaodTimeout=false:上传时是否使用超时机制,默认10秒。true是禁用/false是开启
connectionUploadtimeout="20":上传的超时时间,自定义
acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以接入请求的最大队列长度,超过了这个数字的请求被不予处理(直接丢弃)默认100个。
compression:是否对请响应数据进行压缩,on就是开启,off就是关闭
开启压缩之后,可以有效的减少页面的大小(文本无效,图片,音频,视频)一般可以减少三分之一,节省带宽,默认off。
compression="on"
compressionMinSize:表示响应压缩的最小值,只有响应报文大于这个值才会进行压缩,如果开启了压缩,默认值2048。
noCompressionUserAgents="浏览器名称" 对于这些浏览器,不启用压缩。
compressableMimeType="text/plain,image/jpg"压缩类型,指定对那些类型的文件进行压缩。

常用的页面类型:

文本类型:text/plain,text/html,tetx/css,text/javascript

图片类型:image/jpg,image/jpeg,image/gif

音频:audio/ogg,wav,mpeg

视频:video/mp4,webm,rmvb,quicktime

应用程序:application/pdf,application/json,application/xml

多个之间使用逗号隔开

3、内核优化:系统安全的优化补齐

内核优化的配置文件:

1、打开文件数的限制,系统初始化第一步要做的事情 

vim /etc/security/limits.conf

2、内核参数文件:

vim /etc/sysctl.conf

---------------------------
sysctl -a 查看系统默认参数
常见的
net.ipv4.ip_forward=0/1 禁用或者开启数据包的转发功能。要做路由器必须打开,0是关,1是开
net.ipv4.tcp_max_tw_buckets=2000允许timewait的最大数量。
net.ipv4.tcp_sack=1 启用有选择的应答,提高tcp的处理性能。
net.core.netdev_max_backlog=262144 (字节)网络接口接收数据包队列的最大的大小
vm.swappiness=0 关闭内存的交换行为,不使用交换分区,k8s默认就不能使用交换分区,否则会保存。
net.ipv4.tcp_max_orphans:系统允许的最大的tcp连接数量
net.ipv4.ip_local_port_range=1024 65000 设定系统的端口范围1024-65000
net.ipv4.tcp_fin_timeout=10 tcp关闭连接超时时间
net.ipv4.tcp_keepalive_time:设置tcp的keepalive包的探测包的发送频率,用于检查连接状态

其他的

kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。

kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。

kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。

kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。

net.ipv4.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。

net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。

net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。

net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。

net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。

net.ipv4.tcp_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。

net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。

net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。

net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。

net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心
缓冲区的大小。

net.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。

net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。

net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。

net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。

net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。

net.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。

net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。

net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。

net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。

net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。

net.nf_conntrack_max: 设置最大连接跟踪项数。

vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。

vm.swappiness = 0: 设置内存交换行为,降低内存交换。

fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。

net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。

net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。

net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。

4、 jvm的优化

起jar包的命令

java -jar 包名 &

 在bin下的catalina.sh

对以下命令行进行解释

-Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC" 
cygwin=false

-Xms:java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配的高一点

-Xmx:java堆的最大值,也就是jvm的最大内存,主要取决于物理内存的大小,官方建议设置成与xms一样的值。

设置成物理内存的一半。

-Xmn:新生代内存的大小,官方推荐,设置成jvm内存最大值的3/8

java自带垃圾回收机制,java进行垃圾回收之后不需要重新计算堆区的大小。

堆区:新生代 中生代 老年代

每生成一个新的对象,对象占用的内存空间就是新生代空间。

垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收的资源就转移到中生代,中生代的就会转移到老年代。

整个jvm堆的大小:新生代+老生代+永久代(系统自带的)

-XX:ParallelGCThreads=2:配置并行收集器的线程数,同时有多少个线程一起进行垃圾回收,一般配置成cpu的一半。

-XX:PermSize=1024m:设置非堆内存的初始值,持久带内存的大小,默认是物理内存的1/4,建议设置成整个jvm内存的一半,在非堆内存是不会被java的垃圾回收机制处理的

-XX:MaxPermSize=1024m:非堆内存的最大值,和初始值一致即可。

-Djava.awt.headless=true:防止在linux访问的情况下,web页面的图片不能打开。

+DisableExplicitGC":老年代的收集算法,缩短垃圾回收机制的时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/797511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何将LLM 集成到自动化生产系统

关键词:自动化系统、自主系统、LLM、数字孪生、微服务、多智能体系统 在技术不断发展的背景下,自动化和自主系统这两个术语经常交织在一起,但在影响上有明显的不同。两者都涉及到使用技术执行任务,最小化或不需要人工干预&#x…

Re:从零开始的C++世界——(一)入门基础

文章目录 C发展历史1.命名空间1.1 namespace的价值1.2 namespace的定义1.3 命名空间使⽤ 2.C输⼊&输出3.缺省参数3.1 缺省参数的概念3.2 缺省参数的分类 4.函数重载5.引⽤5.1引⽤的概念和定义5.2 引⽤的特性5.3 const引⽤5.4 使用场景5.5 指针和引⽤的关系 6.内联函数6.1内…

linux_进程周边知识——理解冯诺依曼体系结构

前言: 本篇内容是为了让友友们较好地理解进程的概念, 而在真正了解进行概念之前, 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释, 然后再讲解进程的概念。 ps: 本篇内容适合了解一些linux指…

【redis操作语句】

1.数据库操作 redis默认有16个数据库,编号为0~15,且默认访问0号数据库 获取当前键值对数量:先set创建一个键值对,再用dbsize获取,flushdb清空再获取。 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> dbsize (integer) 1 127.0.0.1:…

opencv 中如何通过欧式距离估算实际距离(厘米)

1:这个方法个人测试觉得是正确的,误差较小,目前满足我当前的需求,如果方法不对,请大家评论,完善。 2:确保拍摄的参照物是垂直的,如果不垂直,就会有误差,不垂…

基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)

基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合,是一种必然的发展趋势。以互联网为基础,以服务于广大用户为目的,发展整体优势,扩…

Flutter实现局部刷新的几种方式

目录 前言 1.局部刷新的重要性 1.概念 2.重要性 2.局部刷新实现的几种方式 1.使用setState方法进行局部刷新 2.使用StatefulWidget和InheritedWidget局部刷新UI 3.ValueNotifier和ValueListenableBuilder 4.StreamBuilder 5.Provider 6.GetX 7.使用GlobalKey 前言 …

游戏三倍补帧工具 Lossless Scaling v2.9.0

运行时请将游戏窗口化或全屏 比如你的显示器是144hz 把游戏限制帧率到48帧后开启三倍补帧 允许撕裂和垂直同步一起来延迟更低 72,48,36,分别对应1/2,1/3,1/4,性能够的话(补帧后满144fps)就优先锁72fps&a…

自动驾驶中的人机互相接管问题讨论

一、背景 人机接管(human takeover)是指在自动驾驶过程中,当系统遇到超出其处理能力或预设安全阈值的情况时,将控制权交还给驾驶员的过程。这一环节的设计直接关系到自动驾驶技术的实用性与安全性,是目前研究和实践中…

深入解析双向链表与单向链表的区别:示例详解

文章目录 一、单向链表与双向链表的定义及结构二、单向链表与双向链表的区别示例插入操作删除操作 三、完整示例四、总结 链表是一种灵活的数据结构,它通过指针连接一系列节点,实现了动态数组的特性。在众多链表类型中,单向链表和双向链表是最…

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要实现的效果&#xff1a;在页面上展示“Hello&#xff0c;World”字符串 1、准备一个【容器】div 想要把“Hello&#xff0c;World”放置在页面上&#xff0c;首先需要准备一个HTML的块级元素div&#xff0c;来承接内容。所以&#xff0c;我们先在<body>中定义<di…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动&#xff0c;本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的&#xff0c;为了不过多赘述&#xff0c;我们直接从GenericSource的onPrepareAsyn…

《昇思25天学习打卡营第17天|K近邻算法实现红酒聚类》

K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;最初由 Cover和Hart于1968年提出是机器学习最基础的算法之一。它正是基于以上思想&#xff1a;要确定一个样本的类别&#xff0c;可以计算它与所…

springboot在线教育平台-计算机毕业设计源码68562

摘要 在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;在线教育已成为教育领域的重要趋势。为了满足广大学习者对于灵活、高效学习方式的需求&#xff0c;基于Spring Boot的在线教育平台应运而生。Spring Boot以其快速开发、简便部署以及良好的可扩展性&#xff0c…

TypeError: Rule.__init__() got an unexpected keyword argument ‘method‘报错的解法

报错如图&#xff1a; 原代码&#xff1a; app.route(/query,method[get,post]) 解决办法很简单&#xff0c;method后加s​​​​​​​ app.route(/query,methods[get,post]) 重新执行代码&#xff0c;不报错了

C++ QT开发 学习笔记(1)

C QT开发 学习笔记(1) 考试系统 创建项目 新建Qt桌面应用程序&#xff0c;项目名&#xff1a;ExamSys。 类信息&#xff1a;类名LoginDialog继承自QDialog &#xff08;1&#xff09; ExamSys.pro 工程文件&#xff0c;包含当前工程的相关信息。 QDialog 是 Qt 框架中用…

大数据基础:Hadoop之MapReduce重点架构原理

文章目录 Hadoop之MapReduce重点架构原理 一、MapReduce概念 二、MapReduce 编程思想 2.1、Map阶段 2.2、Reduce阶段 三、MapReduce处理数据流程 四、MapReduce Shuffle 五、MapReduce注意点 六、MapReduce的三次排序 Hadoop之MapReduce重点架构原理 一、MapReduce概…

JavaScript中的面向对象编程

OPP在JavaScript的表现方式&#xff1a;原型 传统的OPP&#xff1a;类 ● 对象&#xff08;实例&#xff09;由类实例化&#xff0c;类的功能类似于蓝图&#xff0c;通过蓝图来实现建筑&#xff08;实例&#xff09; ● 行为&#xff08;方法&#xff09;从类复制到所有实例 …

【2-1:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http2.3.1 基础概念大多数RPC大多自…

并查集——AcWing 239. 奇偶游戏

目录 并查集 定义 运用情况 注意事项 解题思路 AcWing 239. 奇偶游戏 题目描述 运行代码 代码思路 改进思路 并查集 定义 并查集&#xff08;Disjoint Set Union&#xff0c;简称DSU&#xff09;&#xff0c;是一种树形的数据结构&#xff0c;常用于处理一些不交集…