• 【Tomcat服务部署及优化】


    一、什么是Tomcat?

    Tomcat服务器是Java语言开发的,免费的开放源代码的Web应用服务器
    Tomcat处理静态HTML的能力远不及Apache或者Nginx,通常是作为一个Servlet和JSP容器,单独运行在后端。

    二、Tomcat 核心组件

    2.1 Tomcat 组件

    在这里插入图片描述

    Tomcat的核心功能组件有两个:

    负责接收和反馈外部请求连接器Connector

    负责处理请求容器Container

    其中连接器和容器相辅相成,一起构成了基本的web服务Service。

    Connector:暴露监听端口,接收客户端发来的请求和返回响应消息给客户端

    Container : 负责处理用户请求的业务逻辑。由4个子容器组成(engine、host、context、wrapper),子容器之间是父子关系

    2.3 Container组件的结构

    在这里插入图片描述

    Container 结构分析:
    每个Service会包含一个Container容器。在Container内部包含了4个子容器,4个子容器的作用:
    Engine:引擎,用来管理多个虚拟主机,一个Service最多只能有一个Engine;
    Host:代表一个虚拟主机,也可以叫站点,通过配置Host就可以添加站点;
    Context:代表一个Web应用,包含多个Servlet封装器;
    Wrapper:封装器,容器的最底层。每一Wrapper封装着一个Servlet,负责对象实例的创建、执行和销毁功能。

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

    engine: 引擎,管理多个虚拟主机,一个container只有一个engine

    host: 代表一个虚拟主机

    context: 管理web应用的路径

    servlet封装器,负责处理业务逻辑wrapper:

    2.4 Tomcat 请求过程

    客户端请求过程:

    客户端浏览器——> connector ——>container(engine)——>host ——>context——>wrapper

    container(engine) 根据域名发送给对应的虚拟主机
    host 根据用户访问的URL路径
    context 根据URL路径对应的Web应用
    wrapper 根据应用程序处理业务逻辑

    三、Tomcat 部署

    3.1 安装JDK

    #关闭防火墙和selinux
    systemctl disable firewalld --now
    setenforce 0
     
    #将源代码包置于/opt下
    apache-tomcat-9.0.16.tar.gz 
    jdk-8u201-linux-x64.rpm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    #安装JDK
    cd /opt
    rpm -ivh jdk-8u201-linux-x64.rpm 
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    rpm -ql jdk1.8 | tail -n 1
    #确定安装路径
    
    • 1
    • 2

    在这里插入图片描述

    cd /usr/java/jdk1.8.0_201-amd64/;ls 
    
    - bin: 存放 Java 可执行文件的目录
    - include: 存放 Java 开发头文件的目录
    - jre: 存放 Java 运行时环境的目录
    - LICENSE: JDK 许可证文件
    - README.html: JDK 的直观说明文档(HTML 格式)
    - src.zip: JDK 的源代码压缩包
    - THIRDPARTYLICENSEREADME.txt: 第三方许可证文档
    - COPYRIGHT: JDK 的版权信息
    - javafx-src.zip: JavaFX 源代码压缩包
    - lib: 存放 JDK 和 JavaFX 库文件的目录
    - man: 存放 JDK 手册页(man page)文件的目录
    - release: JDK 的版本信息
    - THIRDPARTYLICENSEREADME-JAVAFX.txt: JavaFX 第三方许可证文档
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    java -version 
    #JDK版本
    
    • 1
    • 2

    在这里插入图片描述

    3.2 设置JDK环境变量

    #查看全局配置文件
    vim /etc/profile
    
    • 1
    • 2

    在这里插入图片描述

    vim /etc/profile.d/java.sh
     
    export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    #最左原则:linux查找可执行文件是根据PATH变量从左往右查找,找到即停止。
    #所以需要将安装版本的路径放在$PATH前面
    
    `CLASSPATH` 是一个环境变量,用于指定 Java 程序运行时的类路径。类路径是指计算机中存储 Java 类文件和库文件的路径。当 Java 程序运行时,虚拟机会搜索类路径上指定的路径,以找到所需的类文件和库文件,以便正确加载和执行程序。
    
    #CLASSPATH和 PATH是必需的,而JAVA_HOME和JRE_HOME是为了方便修改,只需要修改JAVA_HOME
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    source /etc/profile.d/java.sh
    
    java -version#查看JDK版本
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    测试

    找一个java脚本,测试java是否安装成功
    
    • 1

    在这里插入图片描述

    javac HelloWorld.java #编译
    
    • 1

    在这里插入图片描述

    java -cp . HelloWorld #执行
    
    • 1

    在这里插入图片描述

    #补充
    ---------------------------------小知识-------------------------------------------------------------------
    JDK :java development kit (java开发工具)
    JRE :java runtime environment (java运行时环境)
    JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
    CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
    tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
    dt.jar:dt.jar是关于运行环境的类库,主要是swing包。
    ----------------------------------------------------------------------------------------------------------
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.3 安装Tomcat并用supervisor启动

    解压
    #解压tomcat安装包
    cd /opt
    tar zxf apache-tomcat-9.0.16.tar.gz   
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #将源码包目录拷贝至/usr/local/下并重命名为tomcat
    #简化路径,方便管理
    mv apache-tomcat-9.0.16 /usr/local/tomcat
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #启动Tomcat的方法,省略路径
    startup.sh          #后台启动tomcat
    catalina.sh start   #后台启动tomcat
    catalina.sh run     #前台启动 tomcat
    
    #关闭Tomcat的方法:
    shutdown.sh      关闭tomcat
    
    #查看tomcat是否启动:
    netstat ss ps jps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    添加到supervisord服务

    supervisor简介

    supervisor是Python开发的c/s服务,是Linux系统下的进程管理工具。

    可以监听、启动、停止、重启一个或多个进程。

    用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程的自动恢复的功能,不在需要自己写脚本来控制。

    #supervisor常用命令
    #supervisorctl是supervisord的命令行工具
    
    supervisorctl status           查看所有进程的状态
    
    supervisorctl stop <name>      停止进程
    
    supervisorctl start <name>     启动进程
    
    supervisorctl restart <name>   重启进程
    
    supervisorctl update           配置文件修改后可以使用该命令加载新的配置
    
    supervisorctl reload           重载
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    supervisor不能监控后台进程,command不能为后台运行命令

    配置部分

    #安装源和服务
    yum install -y epel-release
    yum install -y supervisor
    
    #建立管理用户
    useradd tomcat
    chown -R tomcat:tomcat /usr/local/tomcat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    #编辑主配置文件
    vim /etc/supervisord.conf
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    vim /etc/supervisord.d/tomcat.conf
    
    [program:tomcat]
    command=/usr/local/tomcat/bin/catalina.sh run  ;程序启动命令
    autostart=true          ;在supervisord启动的时候也自动启动
    startsecs=10            ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    autorestart=true        ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
    startretries=3          ;启动失败自动重试次数,默认是3
    user=tomcat             ;用哪个用户启动进程,默认是root
    priority=999            ;进程启动优先级,默认999,值小的优先启动
    redirect_stderr=true    ;把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes=200MB    ;stdout 日志文件大小,默认50MB
    stdout_logfile_backups=20        ;stdout 日志文件备份数,默认是10
    ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
    stdout_logfile=/var/log/supervisor/logs/catalina.out
    stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
    
    #无释义版
    [program:tomcat]
    command=/usr/local/tomcat/bin/catalina.sh run
    autostart=true
    startsecs=10
    autorestart=true
    startretries=3
    user=tomcat
    priority=999
    redirect_stderr=true
    stdout_logfile_maxbytes=200MB
    stdout_logfile_backups=20
    stdout_logfile=/var/log/supervisor/logs/catalina.out
    stopasgroup=false
    killasgroup=false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

    mkdir -p /var/log/supervisor/logs #创建日志路径
    
    systemctl start  supervisord  #启动服务
    systemctl enable supervisord #开机自启
    
    #启动方式二
    #supervisord -c /etc/supervisord.conf 
    
    supervisorctl reread #重新加载 Supervisor 的配置
    supervisorctl update #应用新的配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    测试能否通过supervisorctl启动
    supervisorctl start tomcat
    supervisorctl status tomcat
    
    • 1
    • 2

    在这里插入图片描述

    浏览器访问Tomcat的默认主页 http://192.168.2.100:8080
    
    • 1

    在这里插入图片描述

    四、Tomcat的端口和主要目录

    4.1 Tomcat端口

    8080: 默认接收 http 请求的端口

    8005: 安全端口,可以关闭tomcat

    8009: apache 和 tomcat 联动 AJP 协议

    8443:负责处理https请求连接

    4.2 主要目录

    目录名字功能
    bin存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh
    conf存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
    lib存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包
    logs存放 Tomcat 日志
    temp存放 Tomcat 运行时产生的文件
    webapps存放项目资源的目录
    workTomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到
    文件名说明
    server.xml主配置文件
    web.xml每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件
    context.xml用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件
    tomcat-users.xml用户认证的账号和密码文件
    catalina.policy当使用security选项启动omcat时,用于为tomcat设置安全策略
    catalina.propertiesTomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数
    logging.propertiesTomcat日志系统相关的配置,可以修改日志级别和日志路径等
    注意配置文件对于大小写敏感

    五、Tomcat虚拟主机

    5.1 为什么要用虚拟主机?

    可能有时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。

    5.2 配置虚拟主机(基于域名)

    配置思路

    例如现在新增两个域名 www.byyb.com,www.byyd.com

    希望通过这两个域名访问到不同的项目内容。

    1)在 webapps 日录中添加各个站点的网页根目录,准备测试页面文件。

    2)修改 tomcat 主配置文件 server.xml

    在 Engine 配置段下面添加多 Host 配置段,设置不同的虚拟主机配置参数;

    在 Host 配置段下添加一个或多个 context 配置段,设置虚拟主机的web应用程序的存放位置。

    docBase="/usr/local/tomcat/webapps/ky31" path=nhttp://www.ky31.com:8080/test/abc.html -> /usr/local/tomcat/webapps/ky31/test/abc.html
    
    docBase="/usr/local/tomcat/webapps/ky31" path="test"http://www.ky31.com:8080/test/abc.html -> /usr/local/tomcat/webapps/ky31/abc.html
    
    • 1
    • 2
    • 3

    具体配置

    1.创建 byyb 和 byyd 项目目录和文件

    mkdir /usr/local/tomcat/webapps/byyb
    mkdir /usr/local/tomcat/webapps/byyd
    
    echo "This is byyb\!" > /usr/local/tomcat/webapps/byyb/index.jsp
    
    echo "This is byyd\!" > /usr/local/tomcat/webapps/byyd/index.jsp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2.修改 Tomcat 主配置文件 server.xml

    vim /usr/local/tomcat/conf/server.xml
    
    #165行前插入
    <Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Context docBase="/usr/local/tomcat/webapps/byyb" path="" reloadable="true" />
    </Host>
    
    <Host name="www.byyd.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Context docBase="/usr/local/tomcat/webapps/byyd" path="" reloadable="true" />\
    </Host> 
    
    ##注释##
    Host 
    name:主机名
    appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
    unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
    autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
    xmlValidation:是否验证xml文件执行有效性检验的标志
    xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
    
    Context
    docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
    path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;
    reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
    ##
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    #重新启动
    supervisorctl restart tomcat
    
    • 1
    • 2

    在这里插入图片描述

    echo "192.168.2.100 www.byyb.com www.byyd.com" >> /etc/hosts
    
    • 1

    28.png&pos_id=img-Xmeb7w3n-1694224381586)

    3.浏览器访问验证

    #使用虚拟机的浏览器访问,windows需要修改本地hosts文件
    浏览器访问 http://www.byyb.com:8080/ 
    浏览器访问 http://www.byyd.com:8080/ 
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    六、Tomcat优化

    怎么查看线程数?

    ss -natp | grep java 看pid

    ps -T -p pid

    6.1 配置文件优化

    maxThreads (最大线程数/并发)

    processorCache (进程缓冲)

    acceptCount (等待队列数)

    enableLookups (关闭DNS反向解析)

    URIEncoding (网页字符集编码UTF-8)

    maxKeepAliveRequests (长连接最大请求数)

    connectionTimeout (连接超时时间)

    compression (开启页面压缩)

    6.2 系统内核优化

    /etc/security/limits.conf 
    nofile 
    nproc  
    memlock
    
    • 1
    • 2
    • 3
    • 4
    /etc/sysct1.conf   
    net .ipv4.tcp_tw_reuse=1   
    net.ipv4.tcp_tw_recycle=1  
    net.ipv4.tcp_fin_timeout=30  
    net.ipv4.tcp_max_tw_buckets=5000              net.ipv4.ip_local_port_range=1024 65535
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6.3 JVM优化

    参数说明举例
    -Xms设置应用程序初始使用的堆内存大小(年轻代+老年代)-Xms2g
    -Xmx设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降-Xms4g
    -XX:NewSize设置初始新生代大小-XX:NewSize=128m
    -XX:MaxNewSize设置最大新生代内存空间-XX:MaxNewSize=256m
    -Xmnsize同时设置-XX:NewSize 和 -XX:MaxNewSize,代-Xmn1g
    -XX:NewRatio以比例方式设置新生代和老年代-XX:NewRatio=2new/old=1/2
    -XX:SurvivorRatio以比例方式设置eden和survivor(S0或S1)-XX:SurvivorRatio=6eden/survivor=6/1new/survivor=8/1
    -Xss设置每个线程私有的栈空间大小,依据具体线程-Xss256k

    catalina.sh 中设置 JAVA_OPTS 参数。

    JAVA OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2046m -Xx:PermSize-1024m -XX:MaxPermSize=1024m -Xmn768m"
    
    • 1
    -server 表示启用JDK的server模式,实现在多核服务器性能更佳 
     
    -Xms2048m 
    -Xmx2048m 设置JVM堆内存初始值和最大值一样大,一般设置为物理内存的 1/2
    
    -XX:Permsize=1024m 
    -XX:MaxPermsize=1024m
    设置永久代《非堆内存) 初始值和最大最一样大,一般设置为物理内存的 1/4
    
    初始值和最大最设置一样大的原因?
    可以减少GC次数和内存伸缩带来的频繁内存中请,从而减少一定的系统开销。
            
    -Xmn 设置JVM堆内存新生代的大小,一般设置为堆内存的 3/8
    
    -xx:ParallelGCThreads=-2 设置并行GC(垃圾回收) 线程数,提高垃圾回收效率 
    -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof  设置进程发生OOM异常退出会进行DUMP备份
    -XX:+DisableExplicitGc 禁止调用System.gc()方法,防止误调用系统gc方法导致系统的JVM堆内存大起大落而使系统响应效率严重降低
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    Mybatis-Plus使用Wrapper自定义SQL
    C++ 11 lamdba表达式详解
    Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
    在anaconda Promat界面import torch通过,在jupyter notebook中报错的问题(仅提供思路理解!)
    物 理 层
    uniapp组件传值的方法(父传子,子传父,对象传值)案例
    跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
    postswigger 靶场(CSRF)攻略-- 2.令牌验证
    尚医通_第11章_医院排班管理和搭建用户系统环境
    基于机智云物联网平台与4G DTU远程车库门
  • 原文地址:https://blog.csdn.net/q2524607033/article/details/132773790