定义:一个开源的web应用服务器。与nginx有区别,nginx主要处理静态页面,动态请求(连接数据库、动态页面)不是nginx处理的强项,动态请求会交给tomcat进行处理(简单来说,nginx转发动态请求给tamcat处理)
作用:①处理动态页面——http请求
②处理后端请求——调用后台数据库服务器
③tomcat易部署,自动识别配置文件,自动部署运行
缺点:轻量级的服务软件,处理中小架构的网站可以满足需要,大型的交互需求tomcat无法处理
大型网站用python,node.js,容器化来处理。在容器化部署的项目架构中不适用tomcat,用jar包直接运行,包括k8s
1、web容器——完成web功能
①处理请求是由nginx转发的http(s)请求,处理的是动态页面(基于java代码编译的页面)
②处理后端的请求(转发到数据库的请求)
2、serverlet——整个tomcat处理的底层逻辑。既处理web请求的动态页面,也处理后端请求(数据库)
3、jsp——jsp会把动态页面翻译成serverlet的代码。用编译后的规则显示代码的静态页面
容器:指的是一种虚拟化技术,允许在当前的操作系统中虚拟化的运行多个独立的环境,这些独立运行的环境就是容器,但彼此之间相互隔离,拥有自己的一套系统资源。显著标志:宿主,容器寄生在宿主上,实际上使用的是宿主资源(类似于虚拟机)
serverlet容器:用于开发web应用程序的关键组件
serverlet容器:用于开发web应用程序的关键组件
作用:①处理http请求
②生成动态内容
③与客户端的交互——前端交互,后端数据库服务器交互,和redis缓存交互
④会话管理——处理用户会话,跟踪用户在不同请求之间的状态
⑤会话保持——serverlet可以在用户访问不同页面时保持用户的状态信息,比如购物车同步,用户同步登录等
类似于java中的类——调用各种方法(开发人员自定)
①接收和响应外部请求连接器connector,默认端口8080
②负责处理请求的container
这两者共同组成service
container里包含:
Engine引擎——管理多个虚拟主机。一个tomcat里只能有一个Engine
host——代表站点,也就是虚拟主机。一个Engine里可以有多个host
context——一个context指向一个web应用(工作目录)
wrapper——最底层,处理和编译代码,运行结果。结果层层向上反馈
tomcat工作流程:层层往下,层层往上
1、请求到连接器,连接的端口是8080,连接器接受请求
2、www.kgc.com 引擎管理虚拟主机——host——www.kgc.com——context——访问www.kgc.com该主机的工作目录——webapps/kgc——index.jsp——wrapper——serverlet来解析index.jsp内容
3、响应的内容返回到客户端
tomcat默认配置不适合生产环境,频繁出现假死,需要通过压力测试不断优化,提高稳定
1、配置文件参数优化
2、jvm优化
3、操作系统优化(内核优化)
(1)配置文件参数优化vim /usr/local/tomcat/conf/server.xml
8443后插入配置优化的内容
①maxThreads=”200” #可以创建的最大线程数(支持的最大并发数)。tomcat使用线程来处理接收的每个请求。(看服务器性能)
②minSpareThreads=”200” #最小空闲线程数。tomcat启动时初始化的线程数,表示即使没有用户请求,也要打开这些空闲线程等待请求
③maxSpareThreads #最大备用线程数。如果创建的线程超过此值,tomcat会关闭不再需要的线程,默认是-1(对创建的线程不做限制)。自带
④connectionTimeout #网络连接超时。一般设置20000毫秒。自带
⑤enableLookups=”false” #是否反向解析域名。默认不解析,提高处理效率
⑥disableUploadTimeout=”ture” #上传时是否启用超时限制
⑦connectionUploadTimeout=”15000” #上传超时时间。没有固定值,根据需求自定。上传比下载耗时。华为设置15000毫秒
⑧accpetCount=”100” #所有的可以使用的线程都被占用可以传入的队列长度的最大值。默认100。超过100,后面的进不来
⑨compression=”on” #是否对响应的数据进行gzip压缩
“force” #强制。所有的情况下都进行压缩
压缩后的页面可以减少三分之一
⑩noCompressionUserAgents=”gozilla chrom” #对指定访问的浏览器不进行压缩
2、jvm优化
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
vim /usr/local/tomcat/conf/tomcat-users.xml
vim /usr/local/tomcat/bin/catalina.sh
JAVA OPTS="$AVA OPTs -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelgCthreads=2 -XX:Permsize=1024m -XX:MaxPermsize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
-server一定要作为第一个参数
-Xms2048m java初始化堆的大小,是分配jvm的最小内存,cpu性能高,可以再设高一点
-Xmx2048m 最大java堆的大小,是分配jvm的最大内存,取决于物内存有多大。建议xms和xmx的值设置成一样,推荐是物理内存的一半。java的垃圾挥手机制清理完堆区后,不需要重新分割计算堆区的大小
-Xmn768m 新生代内存的大小。官方推荐整个堆大小的八分之三
【新生代——java中每新建一个新的对象,占用的内存就是新生代
中生代——对象创建完毕之后,占用的内存就是中生代
老年代——java垃圾回收机制进行资源回收之后,中生代剩余的部分就是老年代
持久代——永不被回收】
-XX:ParallelgCthreads=2 配置并行收集器的线程数,有多少个线程一起进行垃圾回收。官方推荐与cpu数量相同
-XX:Permsize=1024m 设置非堆内存的初始值(持久代)。官方推荐设置为内存的四分之一
-XX:MaxPermsize=1024m 最大非堆内存的大小,持久代内存的最大值。官方推荐设置为内存的四分之一
-Djava.awt.headless=true 避免在linux环境下web页面不能展示图片
-XX:+DisableExplicitGC" 禁止调用system.gc()这个方法。误调用了gc方法会导致整个jvm的响应速度降低
【堆——存储新创建的对象
非堆——存储编译后的代码或压缩后的类或类的元数据】
ajp-nio-8009:连接器中的一种类型。ajp是一种协议,nio是异步非阻塞通信,8009是ajp协议的监听端口
【异步类似于udp协议,只管发,不用确认】
ajp用于tomcat服务器和前端web服务器进行连接,提供负载均衡和高效的请求转发,提高并发的处理能力
http-nio-8080:用于处理http协议的网络请求的端口号8080
3、内核优化
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 攻击
1、配置jdk环境变量
创建脚本vim /etc/profile.d/java.sh
2、解压tomcat包
启动tomcat成功
3、tomcat配置虚拟主机
在公司中运行多个项目,一台服务器部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机,通过不同域名访问不同内容
www.yyy.com
www.sss.com
创建 yyy和sss项目目录和文件
修改 Tomcat 主配置文件server.xml
地址映射
4、客户端浏览器访问验证