tomcat搭建以及优化

news2024/11/26 8:51:56

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的核心功能:

功能部分由两个块组成

  1. 接受和响应外部请求的连接器connector 默认端口8080
  2. 负责处理请求的 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如何配置虚拟主机?

  1. 配置工作目录

在公司当中运行多个项目,一台部署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的优化:

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

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

优化的三个方面:

  1. 配置文件优化
  2. Jvm优化
  3. 操作系统优化(内核优化)

一、(面试)如何对配置文件的参数进行优化?

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
 

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

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

相关文章

MySQL的基础(二)

文章目录 函数&#xff1a;字符串函数数值函数日期函数流程函数 约束id的自动增长&#xff1a;不允许name为NULL值&#xff0c;但不要是字符串的null就行唯一约束实现同样效果的 外键约束语法&#xff08;1)创建的时候就添加(2)已经存在表结构&#xff08;3&#xff09;删除外键…

毕业设计-课程设计-基于python+django+vue开发的外卖点餐网站

文章目录 源码下载地址项目介绍项目功能界面预览项目备注毕设定制&#xff0c;咨询 源码下载地址 点击下载源码 项目介绍 该系统是基于pythondjango开发的外卖点餐系统。适用场景&#xff1a;大学生、课程作业、毕业设计。学习过程中&#xff0c;如遇问题可以在github给作者…

【C++】类和对象(中)之拷贝构造与运算符、操作符重载

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 我们继续学习默认成员函数&#xff0c;本篇文…

C++适配器

文章目录 引言栈和队列 priority_queue仿函数迭代器区间 引言 栈的特性是先进后出&#xff0c;队列的特性是先进先出&#xff0c;然而双向队列同时具有栈和队列的特性&#xff0c;所以我们可以通过双向队列来适配出栈和队列。 先看库里面 栈和队列 stack和queue模板参数里面都…

使用vscode开发uniapp项目常用的辅助插件,提升开发效率

为什么不使用hbuilder开发呢&#xff1f;因为hbuilder对ts和vue3语法支持并不友好&#xff0c;而且代码提示不智能&#xff0c;也不能使用最近很流行的coplit和CodeGeex智能提示&#xff0c;所以就换掉hbulider&#xff0c;使用我们熟悉的vscode开发吧。 第一个&#xff1a;un…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

coalesce函数(SQL )

用途&#xff1a; 将控制替换成其他值&#xff1b;返回第一个非空值 表达式 COALESCE是一个函数&#xff0c; (expression_1, expression_2, …,expression_n)依次参考各参数表达式&#xff0c;遇到非null值即停止并返回该值。如果所有的表达式都是空值&#xff0c;最终将返…

0xGame Web 2023

0xGame Web 2023 [Week 1] signin 这题直接看源码就行&#xff0c;easy [Week 1] baby_php OST /?aQNKCDZO&b240610708 HTTP/1.1 Host: 120.27.148.152:50014 Content-Length: 11 Pragma: no-cache Cache-Control: no-cache Upgrade-Insecure-Requests: 1 Origin: htt…

C++二分查找算法的应用:长度递增组的最大数目

本文涉及的基础知识点 二分查找 题目 给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。 你的任务是使用从 0 到 n - 1 的数字创建若干组&#xff0c;并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外&#xff0c;还必须满足以下条件&…

升级 MacOS 系统后,playCover 内游戏打不开了如何解决

我们有些小伙伴在升级了 macOS 系统后大概率会遇到之前能够正常使用的 playCover 突然游戏打不开了&#xff0c;最近 mac 刚刚正式推出了 MacOS 14.1 ,导致很多用户打开游戏会闪退&#xff0c;我们其实只需要更新一下 playCover 就可以解决 playCover 正式版更新会比较慢所以我…

PyQt界面开发(全)

文章目录 前言一、PyQt 简介二、PyQt 与 Qt 的蒙娜丽莎三、PyQt 布局管理器3.1、简介3.2、项目实战3.2.0、添加伸缩项 layout.addStretch&#xff1a;控制布局中组件之间的间距。3.2.1、垂直布局管理器 QVBoxLayout&#xff1a;控件按照从上到下的顺序排列3.2.2、水平布局管理器…

firefox浏览器添加自定义搜索引擎方法

firefox浏览器添加自定义搜索引擎方法 1.在地址栏添加搜索引擎2.Mycroft Project 搜索引擎附加组件3.通过扩展插件添加自定义搜索引擎 Firefox这货居然不支持直接网址%s的搜索引擎定义方式&#xff0c;以下是添加方法。 firefox国际版119.0 1.在地址栏添加搜索引擎 &#xff…

Android:怎么学习才能更好的进大厂呢?

怎么学习才能更好的进大厂呢&#xff1f; 很多朋友都在问这个问题。 其实没有什么特别的技巧&#xff0c;就是依靠自己的毅力和决心。一天做不到&#xff0c;就一个月&#xff1b;一个月做不到&#xff0c;就一年。只要有决心&#xff0c;无论学历或资历如何&#xff0c;都不是…

Zookeeper和Kafka安装

Zookeeper和Kafka安装 1、Windows下的安装 1.1 安装JAVA JDK 请参考《Windows环境下JDK的安装》 JDK版本&#xff1a; 1.2 安装ZooKeeper 1、 下载安装包 http://zookeeper.apache.org/releases.html#download 这里下载的版本为3.4.9 2、 解压并进入ZooKeeper目录&…

C++ 模板特化

非类型模板参数 定义&#xff1a;对于函数模板和类模板&#xff0c;模板参数并不局限于类型&#xff0c;普通值也可以作为模板参数 非类型模板参数定义的是常量 template<typename T, size_t N> class array; //T&#xff1a;类型模板参数 //N&#xff1a;非类型模板参…

【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式

文章目录 前言一、UIAbility概况1.1 概况介绍1.2 声明配置 二、UIAbility组件生命周期2.1 基本概念2.2 生命周期状态说明Create状态WindowStageCreate和WindowStageDestroy状态Foreground和Background状态Destroy状态 三、UIAbility的启动模式3.1 singleton启动模式说明进行配置…

根据Aurora发送时序,造Aurora 数据包,从而进行AXIS接口数据位宽转换仿真

首先Aurora采用AXIS接口 由于后续需要进行AXIS接口 不同时钟域的数据位宽转换&#xff08;64bit和256bit之间的转换&#xff09;&#xff0c;因此分两次走。 第一种方法&#xff1a;采用AXIS数据位宽转换IP AXIS跨时钟域IP 第二种方法&#xff1a;逻辑完成 下面记录逻辑…

android display 杂谈(三)WMS

用来记录学习wms&#xff0c;后续会一点一点更新。。。。。。 代码&#xff1a;android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中&#xff0c;调用run方法。 private void run() { // Initialize native services.初始化服务&#xff0c;加载andro…

路由器基础(八):策略路由配置

在实际网络应用中&#xff0c;策略路由也是一种重要的技术手段。尽管 在考试并不注重策略路由&#xff0c;但是实际上应用较多&#xff0c;建议考生除了掌握基本的静态路由协议IP route-static, 动态路由协议RIP 、OSPF的基础配置外&#xff0c;还要掌握如何配置策略路由。…

JavaScript事件委托原理详解!

通过JavaScript事件的冒泡来动态为元素绑定事件的方法称为事件委托&#xff08;Event Delegation&#xff0c;也称为“事件代理”&#xff09;&#xff0c;是 JavaScript 中最热门的技术之一&#xff0c;在笔试和面试中是常考察的重点知识点&#xff0c;今天来简单介绍一下相关…