• Tomcat部署及优化


    一、Tomcat概述

    Tomcat是一个开源的web应用服务器

    • 1、处理动态页面(基于http的请求)
    • 2、处理后端请求(主要指调用数据库服务器)
    • 3、易部署,tomcat会自动识别配置文件,自动部署运行
    • 4、轻量级服务软件,处理中小架构的网站可以满足需要,大型的交互需求,tomcat就非长项了,在容器化部署的项目架构中是不适用tomcat的,都是用jar包直接运行,包括k8s

    Tomcat与Nginx的区别

    • nginx主要处理静态页面,动态请求(连接数据库、动态页面)并不是nginx处理的长项
    • 动态的请求会通过nginx转发动态请求交给tomcat进行处

    二、Tomcat核心组件

    1、Web容器:完成web服务器的功能。处理的请求是nginx转发的http(s)请求,此时处理的是动态页面(基于Java代理编译的页面),也处理后端的请求(转发到数据库的请求)

    2、Servlet容器:名字是catalina,是整个tomcat处理的底层逻辑。既处理web请求的动态页面,也处理后端请求(数据库)

    3、JSP容器:jsp会把动态页面翻译成servlet的代码,用编译后的规则显示代码的静态页面

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

    Servlet容器

    • 是用于开发web应用程序的关键组件
    • 生成动态页面内容
    • 主要负责处理http请求,生成动态内容与客户端之间的交互,包括前端交互、与后端数据库服务器交互、和redis缓存交互
    • 还可以对会话进行管理可以处理用户会话,跟踪用户在不同请求之间的状态。会话保持是指可以在用户访问不同页面时保持用户的状态信息

    JSP容器

    Jsp:java server pages,是一种动态网页的开发技术,使用JSP的标签可以在HTML的网页当中插入java代码。标签通常以 <% 开头,以 %> 结尾。

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

    三、Tomcat的功能组件结构

    Tomcat的核心功能部分由两个块组成:

    • Connector:接收和响应外部请求的连接器,默认端口8080
    • Container:负责处理请求

    1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得
    2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应
    3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等
    4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端

    1. Engine:引擎,管理多个虚拟主机,一个tomcat里面只能有一个Engine
    2. host:代表站点,也就是虚拟主机,一个engine可以有多个host
    3. context:一个context指向一个web应用
    4. wrapper:最底层,处理和编译代码,运行结果

    四、Tomcat 服务部署

    1、关闭防火墙

    1. [root@tomcat1 conf]# systemctl stop firewalld
    2. [root@tomcat1 conf]# setenforce 0

    2、安装JDK

    JDK:开发工具包,开发java的应用程序,jdk包括:编译器、调试器等等以及java的类库
    开发者用来创建、编译、运行java程序的重要组件

    1. cd /opt
    2. --传入安装Toncat所需软件包--
    3. rpm -qpl jdk-8u201-linux-x64.rpm
    4. rpm -ivh jdk-8u201-linux-x64.rpm
    5. java -version

    3、设置JDK环境变量

    1. vim /ect/profile.d/java.sh
    2. export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    3. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    4. export PATH=$JAVA_HOME/bin:$PATH
    5. suorce /etc/profile.d/java.sh
    6. java -version
    7. -------------------------------------------------------------------------------------------
    8. export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    9. #设置java_home的环境变量,指向java工作目录jdk
    10. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    11. #java类的搜索路径
    12. export PATH=$JAVA_HOME/bin:$PATH
    13. #将java的可执行命令添加到系统的环境变量当中

    4、部署Tomcat

    1. cd /opt
    2. tar -xf apache-tomcat-9.0.16.tar.gz
    3. mv apache-tomcat-9.0.16 /usr/local/tomcat

    浏览器访问20.0.0.71:8080 

    • bin:存放启动或者关闭tomcat的脚本文件,start.up shoutdown down.sh
    • conf:存放的是配置文件,server.xml就是tomcat的主配置文件
    • webpass:tomcat默认的web应用的部署目录
    • work:tomcat的工作目录,存放jsp编译之后产生的class文件,清理缓存会用到

    五、Tomcat配置虚拟主机

    在公司当中会运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机通过不同域名访问不同的内容

    1. [root@tomcat1 ~]# cd /usr/local/tomcat/webapps/
    2. [root@tomcat1 webapps]# mkdir pup benet
    3. [root@tomcat1 webapps]# cd pup/
    4. [root@tomcat1 pup]# vim index.jsp
    5. this is pup page\!
    6. [root@tomcat1 pup]# cd ..
    7. [root@tomcat1 webapps]# cd benet/
    8. [root@tomcat1 benet]# vim index.jsp
    9. this is benet page\!
    10. [root@tomcat1 webapps]# cd ..
    11. [root@tomcat1 tomcat]# cd conf/
    12. [root@tomcat1 conf]# vim server.xml
    13. --删除148149行--
    14. --添加--
    15. <Host name="www.pup.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    16. <Context docBase="/usr/local/tomcat/webapps/pup" path="" reloadable="true" />
    17. </Host>
    18. <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    19. <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
    20. </Host>
    21. ----------------------------------------------------------------------------------------
    22. Host name="www.pup.com" 指定站点,虚拟主机的域名
    23. appBase="webapps" 站点的工作目录在webapps,存放web应用的目录
    24. unpackWARs="true" 启动webapps,对war包进行展开
    25. autoDeploy="true" 防止在默认应用目录的程序文件自动进行部署
    26. xmlValidation="false" 是否验证XML文件执行的有效性标志
    27. xmlNamespaceAware="false" 是否启动xml命令空间
    28. docBase="/usr/local/tomcat/webapps/pup" web应用程序的具体部署位置,也就是context所属的host中的具体工作目录
    29. path="" 为空,默认就是webapps
    30. reloadable="true" 允许重新加载context相关的web应用程序的类

    1. [root@tomcat1 conf]# echo "20.0.0.71 www.pup.com www.benet.com" >> /etc/hosts
    2. [root@tomcat1 conf]# cd /usr/local/tomcat/bin/
    3. [root@tomcat1 bin]# ./shutdown.sh
    4. [root@tomcat1 bin]# ./startup.sh

    工作流程:

    1、请求到连接器:连接的端口是8080,连接器接收请求
    2、www.pup.com 引擎管理虚拟主机--host--www.kgc.com--context--访问www.pup.com该主机的工作目录--webapps/pup--index.jsp--wrapper--servlet来解析index.jsp内容
    3、响应的内容返回到客户端

    六、Tomcat优化

    Tomcat的优化方案

    • 1、配置文件优化
    • 2、jvm优化
    • 3、操作系统优化

    1、配置文件优化

    1. [root@tomcat1 conf]# vim server.xml
    2. <Connector port="8080" protocol="HTTP/1.1"
    3. connectionTimeout="20000"
    4. redirectPort="8443" />
    5. -------------------------------------------------------------------------------------------
    6. maxThreads="200"
    7. tomcat使用线程来处理接收的每个请求可以创建的最大线程数,支持的最大并发连接数为200
    8. minSpareThreads=200
    9. 最小空闲线程数,tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空的线程等待请求
    10. maxSpareThreads
    11. 最大备用线程数,创建的线程超过这个值,tomcat会关闭不再需要的线程,默认是1(不做限制)
    12. connectionTimeout="20000"
    13. 网络连接超时,一般设置为20000ms
    14. enableLookups="false"
    15. 是否反向解析域名,此处为不解析,提高处理效率
    16. disableUploadTimeout="true"
    17. 上传文件时是否启用超时限制
    18. connectionUploadTimeout
    19. 上传比下载要耗时,根据需求自定义
    20. accpetCount=100
    21. 所有的可以使用的线程都被占用,可以列入的队列长度的最大值,默认100
    22. compression="on" (off禁止压缩,false强制压缩)
    23. 是否对相应的数据进行gzip压缩(压缩之后的页面大小可以减少1/3)
    24. noCompressionUserAgents="gozilla chrom"
    25. 对指定访问的浏览器不进行压缩
    26. -------------------------------------------------------------------------------------------
    27. [root@tomcat1 conf]# cd /usr/local/tomcat/bin/
    28. [root@tomcat1 bin]# ./shutdown.sh
    29. [root@tomcat1 bin]# ./startup.sh

     2、Jvm优化

    1. [root@tomcat1 tomcat]# cd webapps/manager/META-INF/
    2. [root@tomcat1 META-INF]# vim context.xml
    3. --22行修改--
    4. allow=".*" />

    1. [root@tomcat1 tomcat]# cd conf/
    2. [root@tomcat1 conf]# vim tomcat-users.xml
    3. --21行之后插入--
    4. <role rolename="manager-gui"/>
    5. <user username="tomcat" password="tomcat" roles="manager-gui"/>

    1. [root@tomcat1 conf]# cd ..
    2. [root@tomcat1 tomcat]# cd bin/
    3. [root@tomcat1 bin]# ./shutdown.sh
    4. [root@tomcat1 bin]# ./startup.sh

    1. [root@tomcat1 bin]# vim catalina.sh
    2. --插入--
    3. JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmn2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
    4. -------------------------------------------------------------------------------------------
    5. -server:一定要作为第一个参数
    6. -Xms2048m:java初始化堆的大小,是分配jvm的最小内存。cpu性能高,可以值再设高一点
    7. -Xmx2048m:最大java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议-xms和xmx的值设置成一样,推荐是你物理内存的一半
    8. 目的:java的垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小
    9. -Xmn768m:新生代内存的大小,官方推荐整个堆大小的3/8
    10. 新生代:java中没新建一个新的对象,占用的内存就是新生代
    11. 中生代:对象创建完毕之后,占用的内存就是中生代
    12. 老年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分就是老年代
    13. -XX:ParallelGCThreads=2
    14. 配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐与cpu数量相同
    15. -XX:PermSize=1024m
    16. 设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4
    17. -XX:MaxPermSize=1024m
    18. 最大非堆内存的大小,持久代内存的最大值
    19. -Djava.awt.headless=true
    20. 避免在linux环境下,web不能展示图片
    21. -XX:+DisableExplicitGC
    22. 禁止调用system.gc()这个方法,误调用了gc方法,会导致整个jvm的响应速度降低
    23. -------------------------------------------------------------------------------------------
    24. 堆:存储新创建的对象
    25. 非堆:存储编译之后的代码或者是压缩后的类,或者是类的元数据

    1. [root@tomcat1 bin]# ./shutdown.sh
    2. [root@tomcat1 bin]# ./startup.sh

     

    1. ajp-nio-8009
    2. ajp:tomcat服务器和前端web服务器(APACHE/nginx)进行连接,提供负载均衡和高效的请求转发
    3. 连接器当中的一种类型,协议名称就叫ajp
    4. nio:异步非阻塞通信
    5. 8009是ajp协议的监听端口
    6. http-nio-8080
    7. 用于处理http协议的网络请求
    8. 端口:8080
  • 相关阅读:
    Android平台实现lottie动画
    在 CelebA 数据集上训练的 PyTorch 中的基本变分自动编码器
    ubuntu 20.04.4+uWSGI+Nginx安装部署Django+Vue的web前后端全过程记录(1)
    ffmpeg-android studio创建jni项目
    ArduinoUNO实战-第二十一章-通过调整电位器来改变9克舵机的角度
    redis 与Python交互取出来的是bytes类型
    linux驱动注册注销中断处理函数
    AVL的代码剖析(c++)
    spark内核SortShuffle解析_大数据培训
    [算法训练营] 回溯算法专题(二)
  • 原文地址:https://blog.csdn.net/pupcarrot/article/details/133895316