tomcat的部署以及优化

news2025/1/18 10:09:49

tomcat的介绍

Tomcat的简介 

  Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。


Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户(据了解tomcat的并发量处理能力是nginx的六分之一)不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
 

 tomcat的功能

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

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

3.易部署:tomcat会自动部署配置文件,自动部署允许

4.轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求,tomcat就不太行了。(python node,js容器化来处理。在容器化部署的项目架构中是不是要tomcat的,都是用jar包直接运行,包括k8s)

tomcat的核心组件

1.web容器:完成web功能 处理请求也是Nginx转发的http(s)请求,处理动态页面(java代理编译的页面)

处理后端的请求(转发到数据库的请求)

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

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

静态页面:html

动态页面:php index.php

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

servlet主要作用:

1.处理http请求

2.生成动态内容与客户端之间的交互 前端交互 后端数据库服务器交互 和redis缓存交互。

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

JSP:java server pages 动态网页的开发技术,使用jsp的标签在HTML的网页中插入Java代码。以 <% 开头,以%> 结尾

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

tomcat的核心功能

功能部分由两块组成:

1.接受和响应外部请求的连接器 connector 默认端口8080。

2.负载处理请求的 container

其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service

Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。  

Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。


Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。

Container 结构分析:
每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器,4个子容器的作用分别是:

1.   engine 引擎:管理多个虚拟主机,一个tomcat里面只有一个engine

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

3.   context :一个context执行一个web应用。

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

 Engine、Host、Context 和 Wrapper这四个容器之间属于层层递进的父子关系

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

tomcat的部署

JDK介绍

开发工具包,开发Java的应用程序,jdk包括:编译器,调试器等

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

安装环境JDK

将安装包拖入/opt

rmp -ivh jdk-8u201-linux-x64.rpm
//看后缀名

java -version 
//查看版本

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
#设置java_home的环境变量,指向JDK,也就是Java的工作目录
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#指定Java类的搜索路径
export PATH=$JAVA_HOME/bin:$PATH
#把Java的可执行文件添加到系统的环境变量当中

[root@hj opt]# source /etc/profile.d/java.sh  
//刷新
[root@hj opt]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@hj opt]# vim /etc/profile.d/java.sh
[root@hj opt]# 

安装tomcat

[root@hj opt]# tar -xf apache-tomcat-9.0.16.tar.gz
[root@hj opt]# ls
apache-tomcat-9.0.16.tar.gz  apache-tomcat-9.0.16  
jdk-8u201-linux-x64.rpm 
[root@hj opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat
[root@hj opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u201-linux-x64.rpm  
[root@hj opt]# cd /usr/local/tomcat
[root@hj tomcat]# 

tomcat的主要目录

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

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

webapps:tomcat默认的web应用的部署是目录

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

tomcat配置虚拟主机

tomcat配置虚拟主机的作用

在公司当中会运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机

以此来节约资源,提高性能

首先关闭防火墙和sylinux机制

systemctl stop firewalld
setenforce 0

配置工作目录

cd /usr/local/tomcat/webapps
mkdir kfc bennet
cd kfc
vim index.jsp

this is kfc\!
wq!
//工作目录配置完毕(bennet同理)


cd /usr/local/tomcat/conf
vim server.xml
将148删除

在末尾添加配置

<Host name="www.kfc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/kfc" path="" reloadable="true" />
docBase="/usr/local/tomcat/webapps/kfc">
<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 name="www.kfc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

Host name="www.kgc.com"
//指定站点(虚拟机的域名)

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

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

autoDeploy="true"
//放置在应用目录的程序文件会自动进行部署。

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

xmlNamespaceAware="false"
//是否启用xml的命令

<Context docBase="/usr/local/tomcat/webapps/kfc" path="" reloadable="true" />
//web应用程序的具体部署位置,也就是context所属的host中的具体的工作目录。

path=""
//这里为空,默认就是webapps

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

因为涉及到域名,所以一定要做端口映射

echo "20.0.0.10 www.kfc.com www.bennet.com" >> /etc/hosts
cd /usr/local/tomcat/bin
./shutdown.sh
./startup.sh
启动服务

启动之后一定要检查端口

netstat -antp | grep 8080

一切配置完毕即可访问:    20.0.0.10:8080

tomcat 的优化

tomcat优化的目的:

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

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

tomcat优化的三个方面:

1.配置文件优化

vim server.xml
<Connector .......>
  maxThread="200"
   //tomcat使用线程来处理接受的每个请求,可以创建的最大线程数,支持的最大并发连接数200
   minSpareThreads
   //最小空闲线程数,tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空的线程等待请求10
   maxSpareThreads
   //最大备用线程数,创建线程超过这个值,tomcat会关闭不再需要线程,默认是-1
   connectionTimeout  网络连接超时,设置为20000毫秒
   enableLookups="flase"
   //是否反向解析域名。不解析,提高处理效率
   disableUploadTimeout="true"
   //上传文件时,是否启用超时限制
   connectionUploadTimeout="15000"
     //上传下载要耗时,根据需求自定义。
   acceptCount="100"
   //如果所有的可以使用的线程都被占用,可以传入的队列长度的最大值
   compression="on" off force # 所有情况下都进行压缩 on 压缩之后的页面可以减少三分之一
    //是否对响应的数据进行gzip压缩
   noCompressionUserAgents="gozilla chrom"
    //对指定访问的浏览器不进行压缩
/>

2.jvm优化

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC" 
cygwin=false

-Xms2048m:
//Java初始化堆的大小,是分配jvm的最小内存,cpu性能搞,可以值设置高些

-Xmx2048m
//最大Java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议和-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环境下,网页不能正常显示图片

-XX:+DisableExplicitGC
//禁止调用system.gc(),误调用了gc方法,会导致整个jvm响应速度变慢

3.操作系统优化(内核优化)

vim  /etc/security/limits.conf
# 65535 为Linux系统最大打开文件数
* soft nproc 65535 
* hard nproc 65535 
* soft nofile 65535 
* hard nofile 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 的server status

cd META-INF
vim context.xml

cd /usr/local/tomcat/conf
vim tomcat-users.xml

./shutdown.sh
./startup.up
netstat -antp | grep 8080

浏览器访问: 20.0.0.10:8080

即可访问

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

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

相关文章

Go项目踩坑:go get下载超时,goFrame框架下的go项目里将vue项目的dist同步打包发布,go项目打包并压缩

Go项目踩坑&#xff1a;go get下载超时&#xff0c;goFrame框架下的go项目里将vue项目的dist同步打包发布&#xff0c;go项目打包并压缩 go get下载超时goFrame打包静态资源vue项目打包gf pack生成go文件 静态资源使用打包发布go项目交叉编译&#xff0c;省略一些不必要的信息通…

黑客利用人工智能窃取医疗数据的 7 种方式

人工智能被描述为医疗保健行业的一把双刃剑。基于人工智能的系统可以分析大量数据并在早期和可治疗的阶段检测疾病&#xff0c;它们可以比任何人类更快地诊断症状&#xff0c;并且人工智能正在帮助药物开发&#xff0c;使新的救命药物得以识别并将其推向市场速度更快且成本显着…

三集合容斥原理整理

三集合容斥原理的三个公式都是怎么被推导出来的&#xff1f; - 刘明哲的回答 - 知乎 https://www.zhihu.com/question/465008307/answer/2251909478 你必须知道的行测数量知识&#xff08;七&#xff09;容斥问题 - 跟我考公吧的文章 - 知乎 https://zhuanlan.zhihu.com/p/4271…

基于若依框架的药品管理系统

若依框架每张表共有的五个属性&#xff1a; 更改若依后端代码时创建新的module&#xff0c;选择maven&#xff0c;继承ruoyi。 创建实体类时继承BaseEntity&#xff0c;这个类有创建人&#xff0c;创建时间等五个字段&#xff0c;这个类在其它模块中&#xff0c;需要在depende…

在.Core中用EF添加数据库实体类

首先安装dotnet-ef工具&#xff0c;否则提示&#xff1a; *无法执行&#xff0c;因为找不到指定的命令或文件。 可能的原因包括: *你拼错了内置的 dotnet 命令。 *你打算执行 .NET Core 程序&#xff0c;但 dotnet-ef 不存在。 你打算运行全局工具&#xff0c;但在路径上找不到…

SNAP对Sentinel-1预处理

SNAP对Sentinel-1预处理 一、导入数据 二、轨道校正 点击run开始处理 三、噪声去除 打开S-1 Thermal Noise Removal工具 如果选中了VH&#xff0c;就只会输出一个VH极化结果 四、辐射定标 Run 五、滤波处理 六、地形校正 这边的dem需要自己下载 dem下载地址 如果一格…

Orleans的成员管理和故障检测故障检测

Orleans的成员管理和故障检测故障检测 简介 Orleans框架是一个基于.NET平台的开源分布式系统框架&#xff0c;用于开发可扩展&#xff0c;高可用&#xff0c;高性能的云服务应用程序。它采用了Actor模型&#xff0c;将分布式系统中的各个节点抽象成为Actor&#xff0c;使得开…

Linux入门---页表的理解

目录标题 第一次认识页表第二次认识页表如何看待页表页表的大致构成 第一次认识页表 我们第一次认识页表是在介绍地址空间的时候&#xff0c;我们知道操作系统将内存划分为好几个区域&#xff0c;比如说栈区&#xff0c;堆区&#xff0c;未初始化区&#xff0c;已初始化区&…

力扣刷题 day47:10-17

1.位1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 方法一&#xff1a;逐个判断 利用n&1 #方法一&#xff1a;逐个…

重载、重写(覆盖)与重定义(隐藏)

重载、重写&#xff08;覆盖&#xff09;与重定义&#xff08;隐藏&#xff09; 重载隐藏&#xff08;重定义&#xff09;多态&#xff1a;重写&#xff08;覆盖&#xff09; 三者的区别 重载 必须是在一个作用域&#xff0c;函数名相同&#xff0c;参数不同&#xff08;个数不…

C复习-基础知识

参考&#xff1a; 里科《C和指针》Bryant, Hallaron 《深入理解计算机系统》何昊&#xff0c;叶向阳《程序员面试笔试宝典》 从hello.c到可执行文件hello 在Unix系统中&#xff0c;从源文件到目标文件的转化是由编译器驱动程序完成的&#xff1a; root> gcc -o hello hel…

RTOS(4)自己的第一个FreeRTOS程序

创建两个任务 什么是任务呢&#xff1f; 对于整个单片机程序&#xff0c;我们称之为application&#xff0c;应用程序。 使用FreeRTOS时&#xff0c;我们可以在application中创建多个任务(task)&#xff0c;有些文档把任务也称为线程 (thread)。 void Task1Function(void *p…

课时4作业3

Description 某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张&#xff0c;且每种票子至少一张。问&#xff1a;有几种换法&#xff1f; Input 无输入 Output 一个数&#xff0c;表示共有多少种换法 Sample Input 1 无 Sample O…

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…

76.C++ STL list容器

目录 1.什么是list容器 2.list构造函数 3. 元素插⼊和删除操作 4.大小操作 5.赋值操作 6.数据存取操作 7.反转、排序 1.什么是list容器 list 是 C 标准库提供的双向链表容器。它与 vector 和 deque 不同&#xff0c;不是连续的内存块&#xff0c;而是由节点组成的链表结…

C语言——二周目——数据在内存中的存储

目录 一、整数的存储方式 二、浮点数的存储方式 一、整数的存储方式 因为CPU只有加法器&#xff0c;所以对于整型来说&#xff0c;数据在内存中通常采用补码的方式进行储存。 在这里复习一下原码、反码、补码。 正数和无符号数的原码、反码、补码相同&#xff1b; 负数的原…

考察软件开发公司的能力

当公司需要与软件外包公司合作时需要考察软件开发公司的能力和水平&#xff0c;这会涉及到很多方面的因素。需要通过综合考察和了解软件开发公司的能力和水平&#xff0c;选择合适的合作伙伴&#xff0c;确保项目的成功交付。下面分享一些关键步骤和方法&#xff0c;希望对大家…

【JVM】JVM的垃圾回收机制

JVM的垃圾回收机制 对象死亡判断方法引用计数算法可达性分析算法 垃圾回收算法标记清除法复制算法标记整理算法分代算法 Java运行时内存的各个区域,对于程序计数器,虚拟机栈,本地方法栈这三个部分区域而言,其生命周期与相关线程有关,随线程而生,随线程而灭,并且这三个区域的内存…

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结首行”&#xff1b; 2.冻结表格首列 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结…

图扑智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑软件应用自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&a…