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 攻击。