tomcat是一个开源的web应用服务器,区别去nginx,nginx主要处理静态页面,那么动态请求(连接数据库,动态页面)并不是nginx处理的长项,动态的请求会交给tomcat进行处理。
nginx……转发动态请求……tomcat
tomcat:
1.处理动态页面(http的请求)
2.处理后端请求(调用数据库服务器)
3.易部署:tomcat会自动识别配置文件,自动部署运行
4.轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求,tomcat就非长项了。Python node.js容器化来处理,在客气化部署的项目架构中是不使用tomcat的,都是用jar包直接运行,包括k8s。
………………………………………………………………………………………………………
Tomcat的核心组件:
1.web容器:完成web功能,处理请求也是nginx转发的http(s)请求,处理动态页面(基于java代理编译的页面)
处理后端的请求(转发到数据库的请求)
serviet:catalina是整个tomcat处理的底层逻辑,处理web请求的动态页面,也处理后端请求(数据库)
Jsp:jsp会把动态页面翻译成serviet的代码。用编译后的规则,显示代码的静态页面。
静态页面:html
动态页面:php inex.php
jsp index.jsp……java格式写成的代码,靠jsp翻译,serviet执行编译后的代码,最后展示结果。
2、容器:容器通常指的是一种虚拟化的技术,允许在当前的操作系统当中虚拟化的运行多个独立的环境,独立运行的环境就是我们说的容器,彼此之间相互隔离,各自拥有自己的一套系统资源。宿主,容器寄生在宿主上,实际使用的是宿主的资源。(Docker类似,寄生在nginx系统之上。)
Serviet容器:用于开发web应用程序的关键组件
处理http请求 生成动态内容与客户端之间的交互 前端交互 后端数据库服务器交互。和redis缓存交互。
类:(调用方法)java当中,调用各种方法。开发人员自定义的。
根据调用的方法,处理http请求、生成动态页面内容、会话管理
会话管理:处理用户会话,跟踪用户在不同请求之间的状态。Serviet可以在用户访问不同页面时,保持用户的状态信息,如:购物车同步、用户同步登陆等
3、Jsp:java server pages 动态页面的开发技术,使用jsp的标签在HTML的网页中插入JAVA代码。
以<%开头 以%>结尾
实现java web应用程序的访问界面,用户界面,或者访问数据库,生成页面内容。
tomcat的核心功能:
功能部分由两个块组成
- 接受和响应外部请求的连接器connector 默认端口8080
- 负责处理请求的 container
内部组件:
Engine引擎:管理多个虚拟主机,一个tomcat里面只又一个Engine
host:代表站点,也就是虚拟主机,一个Engine可以又多个host
context:一个context执行一个web应用。
wrapper:最底层(封装器),处理和编译代码,运行结果。
………………………………………………………………………………………………………
搭建tomcat
关闭防火墙systemctl stop firewalld
setenforce 0
rpm安装rpm -ivh jdk
java -version
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh
Java -version
Cd bin/ ls cd .. ls cd conf/ ls
……………………………………………………………………………………………………
JDK:开发工具包,开发java的应用程序,jdk包括:编译器,调试器,等等以及java的类库,开发者用来创建、编译、运行java程序的重要组件
JVM:java的虚拟机负责编译后的java字节码编程本地的机器码。
Jvm:内存管理,垃圾回收机制 线程管理。
bin: 存放启动或者关闭tomcat的脚本文件 startup.sh shoutdow.sh
conf:存放的是配置文件 server.xml就是tomcat的主配置文件
webapps:tomcat默认的web应用的部署目录
work:tomcat的工作目录,存放jsp编译之后产生的class文件。清缓存会用到。
vim server .xml
……………………………………………………………………………………………………
tomcat如何配置虚拟主机?
- 配置工作目录
在公司当中运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机,通过不同域名访问不同的内容
www.kgc.com
www.benet.com
cd conf/
vim server.xml
Setnu 148行删掉
160行添加新的
1.创建 kgc 和 benet 项目目录和文件
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp
2.修改 Tomcat 主配置文件 server.xml
vim /usr/local/tomcat/conf/server.xml
--148行删掉
--165行前--插入
<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>
Cd bin netstat -antp | grep 8080
./startup.sh
Cd conf /usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
3.客户端浏览器访问验证
echo "192.168.233.71 www.kgc.com www.benet.com" >> /etc/host
浏览器访问 http://www.kgc.com:8080/ 页面显示This is kgc page\!
浏览器访问 http://www.benet.com:8080/ 页面显示This is benet page\!
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 引学管理虚拟主机……host……www.kgc.com……context……访www.kgc.com该主机的工作目录……webapps/kgc……index.jsp……wrapper……servlet来解析index.jsp内容
3、响应的内容返回到客户端。
………………………………………………………………………………………………………
tomcat的优化:
默认配置并不适合生产环境,频繁的出现假死。
需要通过压力测试不断优化,提高稳定。
优化的三个方面:
- 配置文件优化
- Jvm优化
- 操作系统优化(内核优化)
一、(面试)如何对配置文件的参数进行优化?
vim
71行redirectport后面插入
maxThreads=”200”
#tomcat使用线程来处理接受的每个请求,可以创建的最大线程数。支持的最大并发连接数200
miniSpareThreads
#最小空闲线程数,tomcat启动时的初始化线程数,表示没人请求,也要打开这些空的线程等待请求10
maxSpareThreads
#最大备用线程数,创建的线程超过这个值,tomcat会关闭不再需要的线程,默认是-1(不做限制)
connectionTimeout
#网络连接超时。设置为20000毫秒
enableLookups=”false”
#是否反向解析域名,不解析,提高处理效率
disableUploadTimeout=”true”
#上传文件时,是否启用超时限制
connectionUploadTimeout=” ”
#上传比下载要耗时,根据需求自定义
acceptCount=”100”
#所有的可以使用的线程都被占用,可以传入的队列长度的最大值。
compression=”on” off force 所有的情况下都进行压缩 on压缩之后的页面大小可以减少1/3
#是否对响应的数据进行gzip压缩
noCompressionUserAgents=”gozilla chrom”
#对指定访问的浏览器,不进行压缩
……………………………………………………………………………………………………
二、jvm优化
(配置在bin目录下vim catalina.sh)
-server:一定要作为第一个参数
-xms2048m:java初始化堆的大小,是分配jvm的最大内存。Cpu性能高,可以值再设高一点
-xmx2048m:最大java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议-xms和xmx的值,设置成一样,推荐是你物理的内存的一半。
目的:java的垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小。
-Xmn768m:新生代内存的大小,官方推荐整个堆大小的3/8
新生代:java中每新建一个新的对象,占用的内存就是新生代
中生代:对象创建完毕之后,占用的内存就是中生代
老年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分,就是老年代。
-XX:PararallelGCthreads=2
配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐:与cpu数量相同。
-XX:PermSize=1024m
设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4
-XX:MaxPermSize=1024m
最大非堆内存的大小,持久代内存的最大值,一般设置成物理内存的1/4
-Djava.awt.headless==true
避免在liunx环境下,web不能展示图片
-XX:+DisableExplicitGC
禁止调用system.gc(),会导致整个jvm的响应速度降低。
配置在bin目录下vim catalina.sh
类:(调用方法)java当中,调用各种方法。开发人员自定义的。
堆:存储新创建的对象
非堆:存储编译之后的代码或者是压缩后的类或者是类的元数据
ajp-nio-8009
连接器当中的一种类型:ajp协议名称,nio异步非阻塞通信,8009是aip协议的监听端口
AJP协议:tomcat服务器和前端web服务器(apache或nginx)进行连接
提供负载均衡和高效的请求转发,提高并发的处理能力。
http-nio-8080
用于处理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