Tomcat

一、Tomcat的相关概念

Tomcat的定义

Tomcat:是一个开元的web应用服务器,区别于nginx(nginx主要处理静态页面),动态请求(连接数据库、动态页面)并不是nginx处理的长项,动态请求会交给Tomcat进行处理

(二)Tomcat的功能

  1. 处理动态页面(基于http请求)动态页面的名称:.jsp
  2. 处理后端请求(调用数据库服务器)
  3. 易部署,Tomcat会自动识别配置文件,自动部署运行

Tomcat的缺点

1、Tomcat是轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求非Tomcat的长项(Python、node.js容器化来处理)

2、在容器化部署的项目架构不使用Tomcat,而用jar包直接运行,包括k8s

Tomcat的核心组件

1、web容器

(1)完成web服务器的功能

(2)处理nginx转发的http(s)请求,处理动态页面(Java代理编译的页面)、处理后端的请求(转发到数据库的请求)

2、servlet容器(名字为catalina)

(1)用于处理servlet代码

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

3、jsp容器

(1)把动态网页翻译成servlet代码,用编译后的规则,显示代码的静态页面

①静态页面:html

②动态页面:php  index.php

                      jsp   index.jsp

(Java格式写成的代码,由jsp翻译、servlet执行编译后的代码,最后显示结果)

(五)servlet容器和jsp容器

1、容器:通常是指一种虚拟化的技术,允许在当前的操作系统中虚拟化的运行独立的环境,独立运行的环境就是容器,彼此之间相互隔离,拥有一套自己的系统资源。

2、宿主:容器寄生在宿主上,实际使用的是宿主的资源

3、servlet容器:用于开发web应用程序的关键组件,处理servlet代码

(1)servlet的作用:

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

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

②根据类里的方法处理http请求

③生成动态页面内容

④会话管理:处理用户会话,跟踪用户在不同请求之间的状态,servlet可以在用户访问不同页面时,保持用户的状态信息,购物车同步,用户同步登录等等

4、jsp(Java server pages)动态页面的开发技术

(六)Tomcat的核心功能(功能部分由两块组成)

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

2、负责处理请求的 container

(1)container中的工作组件

①engine:引擎,管理多个虚拟机,一个Tomcat里面只能有一个engine

②host:代表站点(虚拟主机、网站),一个engine里面可以有多个host

③context:一个contest指向一个web应用

④wrapper:最底层,处理和编译代码,运行结果

(七)Tomcat的工作流程(层层向下,层层返回)

1、请求到连接器,连接器的端口8080,连接器接受请求

2、www.kgc.com 引擎管理虚拟主机——host——www.kgc.com——context——访问www.kgc.com该主机的工作目录——webapps/kgc——index.jps——wrapper——servlet来解析index.jsp的内容

3、响应的内容返回到客户端

context指定工作目录、动态页面的格式:index.jsp

Tomcat_第1张图片

二、配置Tomcat

(一)安装jdk

Tomcat_第2张图片

(二)设置jdk环境变量

1、jdk:开发工具包,开发Java的应用程序

(1)包括:编译器,调试器等等,以及Java的类库

(2)主要作用:开发者用来创建、编译、运行Java程序的重要组件

2、jvm:Java的虚拟机

(1)主要负责编译后的Java字节码编程本地的机器码

(2)主要是运行Java的代码,运行完之后产生内存管理、垃圾回收机制、线程管理

Tomcat_第3张图片

Tomcat_第4张图片

Tomcat_第5张图片

(三)安装Tomcat(解压即可)

1、Tomcat的重要配置文件

(1)bin:存放启动或者关闭Tomcat的脚本文件 (startup.sh、shoutdown.sh)

(2)conf:存放的是配置文件,server.xml就是Tomcat的主配置文件

(3)webapps:Tomcat默认的web应用的部署目录

(4)work:Tomcat的工作目录,存放jsp编译后产生的class文件(类文件),清缓存会用到

(5)catalina.out:主日志文件

Tomcat_第6张图片

(四)启动Tomcat服务

Tomcat_第7张图片

Tomcat_第8张图片

(五)Tomcat配置虚拟机(配置工作目录)

在公司当中运行多个项目,一台部署Tomcat太多会浪费资源,所以会在Tomcat中配置多个主机,通过不同域名访问不同的内容(www.yyy.com、www.benet.com)

Tomcat_第9张图片Tomcat_第10张图片

Tomcat_第11张图片

Tomcat_第12张图片

Tomcat_第13张图片

Tomcat_第14张图片

Tomcat_第15张图片Tomcat_第16张图片

Host name="ww.kgc.com"     #指定站点(虚拟主机的域名)

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

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

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

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

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

docBase="/usr/local/tomcat/webapps/kgc"

#web应用程序的具体部署位置,也就是context所属的host中的具体的工作目录

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

三、Tomcat的优化(重点)

默认配置并不适合生产环境,频繁出现假死,生产中需要通过压力测试不断优化,提高稳定

(一)配置文件优化(重点)——主配置文件:server.xml

1、maxThreads=200

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

2、minSpareThreads=200

#最小空闲线程数,Tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空闲的线程等待请求,默认是10,(maxThreads是200,min也设200;但maxThreads过大时,一般min设置为它的一般)

3、maxSpareThreads

#最大备用线程数,如果创建线程的超过这个值,Tomcat会关闭不再需要的线程,默认是-1(不做修改)

4、connectionTimeout

#网络连接超时,默认是0表示永不超时,一般设为20000(毫秒)

5、enablesLookups=false

#是否方向解析域名,一般不解析,提高处理效率

6、disableUploadTimeout=true

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

7、connectionUploadTimeout=15000

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

8、acceptCount=100

#所有的可以使用的线程都被占用,可以传入队列长度的最大值,默认是100

9、compression=on(off;force:所有的情况下都进行压缩)

#是否对响应的数据进行gzip压缩,压缩之后的页面大小可以减少三分之一

10、noCompressionUserAgents=gozilla chrom

#对指定访问的浏览器,不进行压缩

Tomcat_第17张图片

Tomcat_第18张图片

(二)jvm优化

Tomcat_第19张图片

Tomcat_第20张图片

Tomcat_第21张图片

Tomcat_第22张图片

Tomcat_第23张图片

Tomcat_第24张图片

Tomcat_第25张图片

Tomcat_第26张图片

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XXaxPermSize=1024m -Djava.awt.headless=true -XX:+DisablesExplicitGC"

-server

#一定要作为第一个参数

-Xms2048m

#Java初始化堆的大小,是分配jvm的最小内存,CPU性能高,值可以设高一些

-Xmx2048m

#最大Java堆的大小,是分配Java的最大内存,取决于物理内存有多大,建议-Xms和-Xmx的值设置为一样,推荐是你的物理内存的一般

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

-Xmn768m

#新生代内存的大小,官方推荐整个堆大小的3/8

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

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

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

-Xx:ParallelGCThreads=2

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

-XX:PermSize=1024m

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

XX:MaxPermSize=1024m

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

-Djava.awt.headless=true 

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

-XX:+DisableExplicitGC

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

Tomcat_第27张图片

#属于连接器当中的一种类型;ajp是协议的名称;nio是异步非阻塞通信;8009是ajp协议的监听端口

(1)AJP协议:用于Tomcat服务器和前端web服务器(APACHE nginx)进行连接,提供负载均衡和高效的请求转发,提高并发的处理能力

(2)异步:每一步完成,不要确认(类似udp协议)

(3)同步:每完成一步,需要确认

Tomcat_第28张图片

#用于处理http协议的网络请求,端口8080

(三)操作系统优化(内核优化

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

你可能感兴趣的:(tomcat,java)