Tomcat配置文件

news2024/11/18 23:47:44

Tomcat 是一个开源的 web  应用服务器 区别nginx NGINX主要处理静态页面 那么动态请求(连接数据库 动态页面) 并不是NGINXde 长项 动态的请求会交给tomcat

进行处理

Tomcat :

1    处理动态页面请求(http的请求)

2   处理后端请求(调用数据库服务器)

3   易部署 tomcat 会自动识别配置文件,自动部署运行

4  轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求, tomcat就非长相了。python nodejs容器化来处理

在容器化部署的项目架构中是不使用tomcat的,都是用jar包直 接运行,包括k8s.

Tomcat 的核心组件

1 web容器 :完成web 功能处理请求也是NGINX转发的Http(s)请求,处理动态页面(java代理编译的页面) 处理后端的请求(转发数据库的请求)

2 server:catalina是整个tomcat处理的底层逻辑,处理web请求的动态页面 也是处理后端请求(数据库)

3 jsp        jsp会把动态翻译成serlvet的代码 用编译后的规则 显示代码的静态页面

静态页面:html

动态页面: php index.php

index.jsp  java 格式写成的代码,靠jsp翻译 servlet执行编译后的代码 最后展示结果

容器:容器通常是指一种虚拟化的技术,允许在当前操作系统中虚拟化的运行多个独立的环境,独立运行的环境就是我们说的容器,彼此之间相互隔离,拥有自己的一套系统资源。宿主。容器寄生在宿主上,实际使用的是宿主的资源。Docker

Server 容器:用于开发web应用程序的关键组件

处理http请求 生成动态内容与客户端之间的交互,前端交互 后端数据库服务器交互 ,和redis缓存交互

类:Java当中 调用各种方法,开发人人员自定义的

会话管理:处理用户会话,跟踪用户在不同请求之间的状态,server可以在用户访问不同页面是,保护用户的状态信息,

Jsp:全称:java server pages 动态网页的开发技术,使用jsp的标签页在html的网页中插入java代码

<% 开头 %>结尾

实现java web应用程序的访问界面,用户界面,或者访问数据库生成页面内容

Tomcat 的核心功能

功能部分由两个块组成:

1:接受和响应外部请求的连接器connector(端口号8080)

2:负责处理请求的 container

Engine :   引擎。管理多个虚拟主机,一个tomcat 里面只能有一个Enbine

Host :       代表站点 也就是虚拟主机,一个Engine可以有多个host

Context:   一个context 执行一个web应用

Wrapper:  最底层。处理编译代码 运行结果

JDK: 开发工具包,开发java的应用程序, jdk包括编译器,调试器,等等以及java的类库

开发者用来创建、编译运行java程序的重要组件

jdk环境配置文件

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

JVM:  java的虚拟机负责编译后的java字节码编程本地的机器码。运行java的代码。

jvm:  内存管理,垃圾回收机制线程管理。

tomcat 目录下的解释

bin:存放启动或者关闭tomcat的脚本文件startup.sh shutdow.sh

conf存放的是配置文件server.xml就是tomcat的主配置文件

webapps: tomcat默认的web应 用的部署日录。

work: tomcat的工作目录,存放JSP编译之后产生的class文件。清缓存会用到。|

Temp :缓存文件

tomcat配置虚拟机的配置文件的解释

<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

        <Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />

</Host>

<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

        <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />

</Host>

host name="www.kgc.com指定站点(虛拟主机的域名)

appBase="webapps"站点的工作日录在webapps存放web应用的目录

unpackWARS="true"启动webapps,对war包进行展开

autoDeploy="true"防止在默认应用日录的程序文件,自动进行部署。

xmlValidation="false" #是否验证XML文件执行的有效性标志,

xmINamespaceAware="false" #是 否启动xml命令空间。

docBase="/usr/local/tomcat/webapps/kgc" : web应用程序的具体部署位置,也就是context所属的host中的具体的工作日录。

path:为空,默认就是webapps

reloadable="true":允许重新加载context相关的web应 用程序的类。

实验请求过程:

1. 请求到连接器;连接的端口是8080.连接器接受请求
2. www.kgc.com 引學管理虚抑------_w__ c.om----cn_n-x--_访问www.kgc.com该主机的工作-----
webaps------._--- wrapper--servlet来解析index.jsp内容
3.响应的内容返回到客户端。

t omcat 的优化:

默认配置并不适合生产环境,频繁出现假死

需要通过压力测试不断优化,提高稳定

1    配置文件优化(熟背)

2    Jvm优化(熟背)

3    操作系统优化(会背几个内核优化)

配置文件的优化:

vim server.xml到配置文件

maxThreads=”200”

#tomcat 使用线程来处理接受的每个请求,可以创建的最大线程数,支持的最大并发数200

minSpareThreads=200

#最小空闲线程数,tomcat 启动是的初始化线程数,表示没人请求,也要打开这些空的线程等待请求10

maxSpareThreads

#最大备用线程数 创建线程如果超过了这个值,tomcat会关闭不再需要线程 默认是1 不做限制

connectionTimout=”20000”

#网络连接超时。设置为20000毫秒

enableLookups=“false”

#是否解析域名,不解析,提高处理效率

disableUploadTimeout=”true”

#上传文件时,是否启动超时限制

connectionUploadTimeout=”15000”

上传比下载要耗时,根据需求自定义

accpetCount=”100”

#所有的可以使用线程都被占用。可以传入的队列长度的最大值

Compression=”on” off force #所有的情况都进行压缩on压缩之后的页面大小可以减少1/3.是否对响应的数据进行gzip压缩

优化完 将进行下面的操做

jvm的优化:

JAVA_ OPTS=" $JAVA. OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:Perm5ize= 1024m -

XX:MaxPermSize=1024m -Djava.awt.headless-true -XX:+DisableExplicitGC"

-server:-定要作为第一个参数

-Xms2048m: java初始化堆的大小,是分配jvm的最小内存。cpu性能高, 可以值再设高一点

-Xmx2048m:最大java堆的大小, 是分配jvm的最大内存,取决于物理内存有多大。建议-xms和xmx的值,设置成一样, 推荐是你物理

的内存的一般。

目的: java的垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小。

-Xmn768m :新生代内存的大小。宜方推荐整个堆大小的3/8.

新生代: java中每新建一个 新的对象,占用的内存就是新生代

中生代:对象创建完毕之后,占用的内存就是中生代

者年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分,就是老年代。

-XX:Par allelGCThreads=2

配置并行收集器的线程数,有多少个线程一起进行垃圾回收, 訪推荐:与cpu数量相同。

-XX:PermSize=1024m

设置非堆内存的初始值,持久代内存的大小,-般设置为物理内存的1/4.

-XX:MaxPermSize=1024m

最大非堆内存的大小,持久代内存的最大值,一般设置物理内存的1/4

-Djava.awt.headless-true

避免在Linux环境下,web不能展示图片

-XX:+DisableExplicitGC

禁止调用ngsystem.gc(),误调用了hc方法,会导致整个Jvm 的响应速度降低

堆:存储新创建的对象

非堆 存储编译之后的代码或者压缩之后的类或者类的元数据

内核优化 


Linux内核优化中主要针对两个配置文件   /etc/security/limits.conf 和/etc/sysctl.conf 

通常是利用调用内核参数的程序sysctl -a 查询出最优内核参数,然后写入 /etc/sysctl.conf 文件内的。

[root@www opt]# sysctl -a |grep fs.file-max
fs.file-max = 197221     #查询出的文件句柄数量上限。
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
文件句柄(File Handle)是操作系统用于跟踪和管理打开的文件或资源的数据结构。
在操作系统中,每个打开的文件、网络连接、设备等都会被分配一个唯一的句柄,
操作系统通过这个句柄来标识和访问这些资源。

句柄数是指操作系统能够同时管理的句柄的数量。在一个计算机系统中,
许多应用程序和进程需要打开和使用文件、网络连接等资源。每个资源都需要一个句柄来进行操作。
如果系统的句柄数限制太低,就可能导致应用程序无法打开足够的文件、网络连接或其他资源,
从而影响系统的性能和可用性。

因此,调整句柄数的设置是确保系统能够处理并发连接和资源请求的重要一环。
在高负载的服务器环境中,适当地增加句柄数的限制可以提高系统的并发能力和性能。
但是过于激进地增加句柄数可能会消耗过多的系统资源,因此需要根据实际需求和硬件配置进行调整。

永久配置:

注意:设置保存后,需要重新ssh连接才会看到配置更改的变化
vim  /etc/security/limits.conf
# 65535 为Linux系统最大打开文件数
* soft nproc 65535 
* hard nproc 65535 
* soft nofile 65535 
* hard nofile 65535

* soft nproc 65535: 最大进程数软限制为 65535,即可以使用 ulimit -u 命令查看和修改的值。
* hard nproc 65535: 最大进程数硬限制为 65535,即最大可分配的进程数。
* soft nofile 65535:最大打开文件数软限制为 65535,即可以使用 ulimit -n 命令查看和修改的值。
* hard nofile 65535:最大打开文件数硬限制为 65535,即最大可分配的文件数。
这里使用的通配符 * 表示对所有用户生效。

其他调试内核参数的查看: sysctl -a

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套接字快速回收。

net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。

net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。

net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。

net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。

net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和
发送缓冲区大小。

net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue集成钉钉单点登录

初始环境判断 判断是否是来自钉钉环境的访问&#xff0c;返回&#xff1a;boolean类型值 window.navigator.userAgent.includes("DingTalk")前端引入vue中钉钉相关的依赖&#xff0c;并获取钉钉的临时授权码 import * as dingtalk from dingtalk-jsapi; let that …

某翻译网站webpack 全扣js逆向法

持续创作文章&#xff0c;只是为了更好的思考 如下内容&#xff0c;如果有写的不清楚&#xff0c;不对的地方&#xff0c;也请大家提醒我一下&#xff0c;谢谢&#xff01; 本次的目标是某道翻译网站&#xff0c;相信各位爷应该明白&#xff0c;这次逆向的整体做法还是把webpac…

Element UI打开表单自动验证问题的解决

最近深陷Element表单验证的坑&#xff0c;被一个问题困扰了好几天&#xff1a;页面一打开什么都没做表单就自动验证。在排除页面未触发了validate方法的情况下&#xff0c;需要观察下rules值是否发生了变化&#xff0c;如果rules值发生了变化&#xff0c;需要在<el-form>…

单片机学习一定要先买开发板么?

今日话题&#xff0c;单片机学习一定要先买开发板么&#xff1f;不一定要先买&#xff0c;但如果想要深入学习&#xff0c;在对单片机有了一定的了解之后&#xff0c;还是建议买。如果是单纯为了入门学习单片机&#xff0c;完全可以用仿真软件。不过&#xff0c;如果想要用单片…

木与空间的舞蹈:奥地利住宅的独特设计

国外著名设计师&#xff0c;为一位业主设计了一座住宅&#xff0c;附带有附属建筑和有盖的入口&#xff0c;形成了像庭院一样的建筑群。 这座住宅采用了当地的传统建筑风格&#xff0c;有长方形的平面和陡峭的顶棚&#xff0c;与周围的房屋相符。然而&#xff0c;内部设计别具一…

【ChatGLM2-6B】在只有CPU的Linux服务器上进行部署

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…

PhotoShop字体加粗,PhotoShop字体添加边框,PhotoShop设置文字背景为图片

字体加粗 创建文字&#xff1a; 选中文字 &#xff08;用鼠标点一下&#xff09; 然后 转换为智能对象 输入合适的数值即可加粗字体 字体添加外边框 点击字体&#xff0c;点击右下角的fx 咋fx中选择描边 设置文字背景为图片 将文字放到刚刚图片所在的位置即可 。…

useragent识别访问设备

背景需求 ruoyi框架&#xff0c;前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js&#xff0c;在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…

F5负载均衡知多少?一文为你详细解读

在当今数字化时代&#xff0c;网络应用的可用性和性能对于企业的成功至关重要。而F5负载均衡技术则成为了许多企业实现高可用性和高性能的关键工具之一。那么什么是负载均衡&#xff0c;F5负载均衡有哪些强大的性能呢&#xff1f;跟上我的脚步一起来看看&#xff0c;充实你的知…

cbu和无cc的shiro反序列化

前置知识 学习CommonsBeanutils之前应该知道 javaBean&#xff0c;可以看《Java简单特性》也可以看这里有关BeanComparator的介绍TemplatesImpl gadget&#xff0c;前两个方法是public TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> Tem…

用于细胞定位的指数距离变换图--Exponential Distance Transform Maps for Cell Localization

论文&#xff1a;Exponential Distance Transform Maps for Cell Localization Paper Link&#xff1a; Exponential Distance Transform Maps for Cell Localization Code&#xff08;有EDT Map的生成方式&#xff09;&#xff1a; https://github.com/Boli-trainee/MHFAN 核…

2023.10.18 区别 对象 和 类对象

目录 对象 类对象 总结 对象 对象是类的实例化结果它是内存中的一块区域&#xff0c;包含了该类的属性和方法的具体值和实现对象具有唯一的标识、状态、行为通过创建类的实例&#xff0c;我们可以在程序中操作和处理具体的对象 简单实例 class Person {public int high 1…

ruoyi识别访问设备是pc端还是移动端跳转到对应的登录页面

背景需求 ruoyi框架&#xff0c;前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js&#xff0c;在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…

6. 方法引用

我们在使用lambda时&#xff0c;如果方法体中只有一个方法的调用的话&#xff08;包括构造方法&#xff09;,我们可以用方法引用进一步简化代码。 6.1 推荐用法 我们在使用lambda时不需要考虑什么时候用方法引用&#xff0c;用哪种方法引用&#xff0c;方法引用的格式是什么。…

java正则校验金额

整数位5位 小数位4位 public static boolean judgeTwoDecimalFour(Object obj) {boolean flag false;try {if (obj ! null) {String source obj.toString();// 判断是否是整数或者是携带一位或者两位的小数Pattern pattern Pattern.compile("^[]?([0-9]{1,5}(.[0-9]{1…

【数字人】4、RAD-NeRF | 通过解耦 audio-spatial 编码来实现基于 NeRF 的高效数字人合成

文章目录 一、背景二、方法2.1 问题定义2.2 Decomposed audio-spatial encoding module2.3 Pseudo-3D Deformable Module 用于控制 torso2.4 训练细节 三、效果3.1 实验设置3.2 对比 论文&#xff1a;Real-time Neural Radiance Talking Portrait Synthesis via Audio-spatial …

【前端学习】—变量类型和计算(五)

【前端学习】—变量类型和计算(五) 一、JS中使用typeof能得到哪些类型 字符串(String):表示文本数据,用单引号或双引号括起来。 数字(Number):表示数值数据,包括整数和浮点数。 布尔值(Boolean):表示真或假(true或false)的逻辑值。 空值(Null):表示一个空…

echarts的markline警标线(一条/多条)的使用

echarts之markLine(可以设置特定阈值线(警戒线)) 一条线写法 series: [{name: Fake Data,type: line,showSymbol: false,data: data,markLine: {symbol: [none, none], // 去掉箭头label: {show: false,position: start,formatter: {b}},data: [{name: 阈值,yAxis: 200}],line…

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用

Windows上 查看端口占用&#xff1a; netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例&#xff1a; Linux 上 查看端口占用&#xff1a; netstat -tuln | grep <端口号> lsof -i:<端口号&…

Canvas绘图学习笔记:画笔的路径与状态

beginPath beginPath表示开始一个路径&#xff0c;我们在上一章画弧的时候用到过好多次&#xff0c;他的API非常简单&#xff1a; context.beginPath(); 开始路径有2层意思&#xff0c;一个就是本次绘制的起点是新的&#xff08;不再是上次结束的点了&#xff09;&#xff0…