美文网首页
长文!Java容器Tomcat等中间价原理、安装、配置和使用

长文!Java容器Tomcat等中间价原理、安装、配置和使用

作者: 程序员面试吧 | 来源:发表于2020-09-07 15:37 被阅读0次

    操作系统,中间件,数据库,并称软件系统领域三大高地。中间件是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。中间件的作用,主要是为复杂的应用程序抽象出通用的公共部分,以降低应用开发的复杂程度。

    因此,中间件随着客户需求的更新以及技术条件的变革,得到了不断地发展。 中间件的发展,经历了TM监控器、交易中间件、消息中间件、ORB中间件、应用服务器等阶段。目前用户的需求已经从纯粹追求单方面的功能如事务、交易、消 息逐渐上升到需要一个整合平台,而技术上,则从基于C、以及CORBA的技术、发展到J2EE。现在,J2EE应用服务器是市场上的主流的中间件。 从整个软件产业来说,中间件搭建了应用与技术之间的桥梁,成为软件产业链条上不可或缺的一环,其作用巨大。从市场上看,中间件市场每年的增长超过了整个软件行业的增长。

    国内中间件市场主要被两大国外厂商IBM和BEA垄断。他们提供以J2EE应用服务器为核心的中间件产品,在银行、证券、电 信、甚至政府等行业中得到广泛应用。电子商务的倡导者,IT业界的巨头IBM在1999推出应用服务器WebSphere,凭借IBM的整体影响力进行销 售,在金融等行业根基很深。 BEA是一家专门致力于中间件开发的公司。它的应用服务器产品Weblogic发布时间早,在国外电子商务中已经广泛应用。 该公司主要面向行业和高端市场,目前在国内电信及证券行业占据主要地位。Sun公司本是Unix工作站的硬件厂商,但随着其倡导的JAVA技术在 Internet应用中的地位越来越重要,并且J2EE已成为业界标准,Sun已经成为Internet技术的领头人之一。而Sun在近两年中收购了三家 应用服务器厂商,便是对该技术最大的肯定。

    在全球市场,IBM、BEA、Sun、Iona、Oracle、Sybase等大型应用服务器 供应商正暗战不断。然而让人遗憾的是,在这些如火如荼的新技术风暴中,我们却始终难觅国产中间件厂商的身影。国内企业在应用服务器的选择上,不仅仅要承受 国外厂商巨额的费用,面临着本地支持不够的问题,还涉及到国家信息安全等深层次的考虑。国内软件厂商和国内企业均处于比较尴尬的境地。

    下面我们就对主流Java容器Tomca下详细说明:

    (一)Tomcat简介

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,它早期的名称为catalina,后来由Apache、Sun 和其他一些公司及个人共同开发而成,并更名为Tomcat。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选,因为Tomcat 技术先进、性能稳定,成为目前比较流行的Web 应用服务器。Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,但它是独立运行的。目前最新的版本为Tomcat 8.0.24 Released。

    Tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现;但由于遵守apache开源协议,tomcat却又为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss和JOnAS。尽管Tomcat对Jave EE API的实现并不完整,然而很企业也在渐渐抛弃使用传统的Java EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。这些开源组件如Structs、Spring和Hibernate,而Tomcat能够对这些组件实现完美的支持。

    (二)Tomcat的架构:

    Tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:

    —顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;
    —连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
    —容器:包含一组其它组件;
    —被嵌套的组件:位于一个容器当中,但不能包含其它组件;

    各常见组件:
    1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
    2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。

    连接器类组件:
    3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。

    容器类组件:
    4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
    5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
    6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。

    被嵌套类(nested)组件:
    这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
    7、阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
    8、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
    9、领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。

    引擎(Engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接收请求并响应请求。它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。

    Tomcat连接器架构:

    基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat6中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。

    APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。
    同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用mod_proxy模块。

    如果支持APR:



    如果不支持APR:


    连接器协议:
    Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。

    AJP(Apache JServ Protocol)协议:目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。

    HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于商前服务器的请求。

    [Tomcat的安装、配置及使用]((https://mp.weixin.qq.com/s/sZ4dBa3E22qMC3JgCVMMeQ)

    (一)JDK
    — JDK是 Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境
    —(JVM+Java系统类库)和JAVA工具,没有JDK的话,无法编译Java程序(指java源码.java文件)

    使用tomcat,首先安装JDK并配置java环境。

    1、JDK版本一
    OpenJDK: 开源版本
    关闭防火墙和selinux,同步时间

    [root@tomcat-77 ~]# yum -y install ntpdate
    [root@tomcat-77 ~]# ntpdate time2.aliyun.com
    
    安装jdk,这里选择java-1.8.0-openjdk,yum本地安装即可
    [root@tomcat-77 ~]# yum -y install java-1.8.0-openjdk
    [r[root@tomcat-77 ~]# java -version   #版本查询
    openjdk version "1.8.0_181"
    OpenJDK Runtime Environment (build 1.8.0_181-b13)
    OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)  #混合模式
    注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
    设定java环境变量
    [root@tomcat-77 ~]# echo  $JAVA_HOME   #查询是否有路径
    [root@tomcat-77 ~]# vim /etc/profile.d/java.sh  #编写脚本
    export JAVA_HOME=/usr
    [root@tomcat-77 ~]# . /etc/profile.d/java.sh
    [root@tomcat-77 ~]# echo $JAVA_HOME
    /usr
    

    2、JDK版本二
    Oracle JDK:oracle官方版本
    —oracle官方网站下载,安装相应版本的rpm包;

    jdk-VERSION-OS-ARCH.rpm
    例如:jdk-1.8.0_25-linux-x64.rpm
    

    3、java环境变量配置
    安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
    OpenJDK版本:

    JAVA_HOME=/usr
    

    Oracle JDK版本:

    JAVA_HOME=/usr/java/jdk_VERSION
    

    二、Servlet容器:
    servlet容器的主要任务是管理servlet的生命周期。而web容器更准确的说应该叫web服务器,它是来管理和部署 web应用的。
    web容器最典型的就是tomcat了,Tomcat是web容 器也是servlet容器。

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
    狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
    最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
    三、java在web中的应用JSP技术
    1、JSP技术定义
    JSP是一种技术,JSP技术是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。使JSP开发的Web应用可以跨平台运行。
    JSP属于Servlet,因为在编译JSP时,会把JSP先编译为一个Servlet,然后由容器来提供服务

    2、JSP页面运行过程
    .jsp文件 -->jasper--> .java --> javac --> .class类 --> jvm虚拟机
    示例:

    <html>
    <title>TITLE</title>
    <body>
    <h1>...</h1>
    <%
    ... java code... #java代码
    %>
    </body>
    </html>
    

    注意:基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码;

    3、JSP Container: jsp容器
    JSP技术加Servlet容器就是形成了jsp容器,他就是后来的JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。

    商业实现软件有:
    WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...
    开源实现软件有:
    Tomcat, Jetty, Resin, ...
    四、Tomcat安装
    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
    官方网站:http://tomcat.apache.org/
    Java 2 EE技术体系的不完整实现;

    1、安装Tomcat:
    方法一:Tomcat的Base Repo安装:

    [root@tomcat-77 ~]# yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
    [root@tomcat-77 ~]# systemctl start tomcat.service
    

    tomcat #核心包
    tomcat-lib #库文件
    tomcat-admin-webapp s#基于web页面管理接口
    tomcat-webapps #jsp示例程序
    tomcat-docs-webapp #操作文档页面

    方法二:Tomcat 解压展开安装

     ~]# tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/  #解压缩到指定目录
     ~]# cd /usr/local
    local ~]# ln -sv apache-tomcat-VERSION  tomcat  #设置别名
    local ~]# vim /etc/profile.d/tomcat.sh  #编辑环境变量shell
    export CATALINA_BASE=/usr/local/tomcat
    export PATH=$CATALINA_BASE/bin:$PATH
    local ~]# .  /etc/profile.d/tomcat.sh #执行
    local ~]#  cd tomcat/bin
    bin ~]#catalina.sh --help #帮助信息
    bin ~]#catalina.sh version  #版本信息
    bin ~]#catalina.sh start  #启动 tomcat
    bin ~]#catalina.sh stop #停止tomcat
    bin ~]#catalina.sh stop 9 #9秒后停止tomcat
    bin ~]#catalina.sh stop 9 -force#9秒后强制停止tomcat
    

    2、tomcat程序环境:
    tomcat的目录结构
    bin:脚本,及启动时用到的类;
    conf:配置文件目录;
    lib:库文件,Java类库,jar;
    logs:日志文件目录;
    temp:临时文件目录;
    webapps:webapp的默认目录;
    work:工作目录;

    3、tomcat的配置文件构成:
    server.xml:主配置文件;

    web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
    context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的>webapps提供默认配置;
    tomcat-users.xml:用户认证的账号和密码文件;
    catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
    catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
    logging.properties:日志系统相关的配置;

    4、Tomcat的核心组件:server.xml

    <Server>
        <Service>
           <connector/>
            <connector/>
    ...
            <Engine>#引擎
                 <Host> #主机
                    <Context/> #程序
                    <Context/>
                   ...
                </Host> 
                 <Host>
                  ...
                </Host>
                  ...
             </Engine>
        </Service>
    </Server>
    

    每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

    顶级组件:Server
    服务类组件:Service
    连接器组件:http, https, ajp(apache jserv protocol)
    容器类:Engine, Host, Context
    被嵌套类:valve, logger, realm, loader, manager, ...
    集群类组件:listener, cluster, ...

    五、JSP WebAPP部署:
    1、JSP WebAPP的组织结构:

    /: webapps的根目录
    index.jsp:主页;
    WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
    META-INF/:类似于WEB-INF/;
    classes/:类文件,当前webapp所提供的类;
    lib/:类文件,当前webapp所提供的类,被打包为jar格式;

    2、webapp归档格式:
    .war:webapp
    .jar:EJB的类打包文件;
    .rar:资源适配器类打包文件;
    .ear:企业级webapp;

    [root@tomcat-77 ~]# ls /var/lib/tomcat
    webapps
    

    3、部署(deploy)webapp的相关操作:
    步骤:
    deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM;
    部署有两种方式:自动部署和手动部署
    操作分为:

    冷部署:把webapp复制到指定的位置,而后才启动tomcat;
    热部署:在不停止tomcat的前提下进行部署;
    反部署:
    undeploy:,停止webapp,并从tomcat实例上卸载webapp;

    部署工具:
    manage:r、ant脚本、tcd(tomcat client deployer)等;

    命令:
    start:启动处于停止状态的webapp;
    stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
    redeploy:重新部署;

    4、手动提供一测试类应用,并冷部署:
    示例:

    [root@tomcat-77 ~]# cd  /var/cache/tomcat/work
    [root@tomcat-77 work]# ls
    Catalina
    [root@tomcat-77 work]# tree Catalina/
    Catalina/
    └── localhost
        ├── _
        │   └── org
        │       └── apache
        │           └── jsp
        │               ├── index_jsp.class
        │               └── index_jsp.java
        ├── docs
        ├── examples
        ├── host-manager  #管理虚拟主机
        ├── manager
        │   └── org
        │       └── apache
        │           └── jsp
        │               └── WEB_002dINF
        │                   └── jsp
        │                       ├── _401_jsp.class
        │                       └── _401_jsp.java
        └── sample
    
    # mkidr  -pv  /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}
    创建文件/usr/local/tomcat/webapps/test/index.jsp
    <%@ page language="java" %>
    <%@ page import="java.util.*" %>
    <html>
    <head>
    <title>Test Page</title>
    </head>
    <body>
    <% out.println("hello world");
    %>
    </body>
    </html>
    

    六、tomcat的两个管理应用:
    1、启用manager

    [root@tomcat-77 ~]# vim /etc/tomcat/tomcat-users.xml 
     <role rolename="manager-gui"/>   <user username="tomcat" password="tomcat" roles="manager-gui"/>
    [root@tomcat-77 ~]# systemctl restart tomcat
    


    2、host-manager虚拟主机管理

    [root@tomcat-77 ~]# vim /etc/tomcat/tomcat-users.xml 
    <role rolename="admin-gui"/> 
      <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
    [root@tomcat-77 ~]# systemctl restart tomcat
    


    通过gui界面,可以热部署虚拟主机

    3、tomcat的常用组件配置:
    Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;
    Service:用于实现将一个或多个connector组件关联至一个engine组件;

    4、Connector连接器组件:
    负责接收请求,常见的有三类http/https/ajp;
    进入tomcat的请求可分为两类:
    (1) standalone : 请求来自于客户端浏览器;
    (2) 由其它的web server反代:来自前端的反代服务器;
    情况一:nginx反代 --> http connector --> tomcat
    情况二:
    httpd(proxy_http_module)反代 --> http connector --> tomcat
    httpd(proxy_ajp_module)反代 --> ajp connector --> tomcat
    情况三:httpd(mod_jk) --> ajp connector --> tomcat

    5、Connector连接器属性:

    port="8080" #监听的端口
    protocol="HTTP/1.1" #协议
    connectionTimeout="20000" #超时时间
    address:监听的IP地址;默认为本机所有可用地址;
    maxThreads:最大并发连接数,默认为200;
    enableLookups:是否启用DNS查询功能,提升性能建议关闭;
    acceptCount:等待队列的最大长度;
    secure:安全
    sslProtocol:

    6、Engine容器组件:
    Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;
    Engine容器组件属性:

    name= #名称
    defaultHost="localhost" #默认主机
    jvmRoute= :jvm的路由标识

    7、Host组件:
    位于engine内部用于接收请求并进行相应处理的主机或虚拟主机

    示例:
    <Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"> #自动部署
    </Host>
    

    常用属性说明:
    (1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
    (2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;

    示例:
    <Host name="tc1.magedu.com" appBase="/appdata/webapps"   #webapps的默认存放目录
     unpackWARs="true" autoDeploy="true">#自动部署
    </Host>
    
    # mkdir -pv /appdata/webapps #创建存储目录
    # mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}     #创建目录,站点部署到root路径下
    

    提供一个测试页即可;

    8、Context组件:

    示例:
    <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable="true"/> #访问url路径,然后被指定其他路径上,可以被重新装载
    

    9、Valve组件:

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"  #prefix日志前缀,suffix日志为后缀
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />#这里&quot是引号的意思,%r用户的请求内容
    

    Valve存在多种类型:
    定义访问日志:org.apache.catalina.valves.AccessLogValve
    定义访问控制:org.apache.catalina.valves.RemoteAddrValve
    tomcat日志路径:/var/log/tomcat/
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172.16.100.67"/>

    综合示例:
    <Host name="node1.magedu.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="node1_access" suffix=".log"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    <Context path="/test" docBase="/tmp/test" reloadable="true">   #访问url为test,文档路径为tmp/test,可以被重新装载
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="node1_test_access_" suffix=".log" #前缀是node1_test_access,后缀是log
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />  #记录日志格式
    </Context>
    </Host>
    

    七、tomcat反代配置
    1、LNMT架构
    Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)

    nginx连接器

    nginx反代设置:
    vim /etc/nginx/conf.d/ilinux.conf
    server {
         listen 80;  #监听端口
          server_name www.ilinux.io; #服务名称 
    location / {
    proxy_pass http://192.168.1.15:80;  #匹配静态内容到后端静态主机的80端口
    }
    
    location ~* \.(jsp|do)$ {
    proxy_pass http://192.168.1.16:8080; #匹配动态jsp内容到后端Tomcat主机
    }
    

    2、LAMT架构
    Linux Apache(httpd) MySQL Tomcat
    httpd的代理模块:

    proxy_module:反代核心模块
    proxy_http_module:适配http协议客户端;
    proxy_ajp_module:适配ajp协议客户端;

    Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
    Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
    Client (http) --> httpd (mod_jk)(ajp) --> tomcat (ajp connector)

    http连接器:使用proxy_http_module模块反向代理

    #proxy_http_module代理配置示例:
    <VirtualHost *:80>  #定义虚拟主机
    ServerName      tc1.ilinux.io
    ProxyRequests Off   #关闭正向代理
    ProxyVia        On     #在响应报文中加via
    ProxyPreserveHost On  #请求报文转发到后端
    <Proxy *>
        Require all granted #反代功能可以由那些用户使用
    </Proxy>
    #如果后端有多个虚拟主机,不能使用ip地址
    ProxyPass / http://192.168.1.15:8080/ #后端tomcat主机地址端口  
    ProxyPassReverse / http://192.168.1.15:8080/ #返回重定向 
    <Location />
    Require all granted  #此url可以被谁访问
    </Location>
    </VirtualHost>
    

    ajp连接器:使用proxy_ajp_module代理

    #proxy_ajp_module代理配置示例
    <VirtualHost *:80>
    ServerName      tc1.ilinux.io
    ProxyRequests Off#关闭正向代理
    ProxyVia        On     #在响应报文中加via
    ProxyPreserveHost On
    <Proxy *>
    Require all granted#反代功能可以由那些用户使用
    </Proxy>
    #如果后端有多个虚拟主机,不能使用ip地址
    ProxyPass / ajp://http://192.168.1.15:8009/  后端tomcat主机地址端口  
    ProxyPassReverse / ajp://http://192.168.1.15:8009/
    <Location />
    Require all granted#此url可以被谁访问
    </Location>
    </VirtualHost>
    

    八、Tomcat的常用优化配置:
    1 、内存空间管理:





    编辑/etc/sysconfig/tomcat

     #重要不能超过32G!!!!!!!!!!!
    JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=" 
    #实验添加:
    JAVA_OPTS= "-Xmx512m"  -Xms"512m"
    

    server:服务器模型
    Xms:堆内存初始化大小;
    Xmx:堆内存空间上限;
    XX:NewSize=:新生代空间初始化大小;
    XX:MaxNewSize=:新生代空间最大值;
    XX:PermSize=:持久代空间初始化大小;
    XX:MaxPermSize=:持久代空间最大值;

    2、线程池设置:
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    常用属性:

    maxThreads:最大线程数;
    minSpareThreads:最小空闲线程数;
    maxSpareThreads:最大空闲线程数;
    acceptCount:等待队列的最大长度;
    URIEncoding:URI地址编码格式,建议使用UTF-8;
    enableLookups:是否启用dns解析,建议禁用;
    compression:是否启用传输压缩机制,建议“on";
    compressionMinSize:启用压缩传输的数据流最小值,单位是字节;
    compressableMimeType:定义启用压缩功能的MIME类型;
    text/html, text/xml, text/css, text/javascript

    3)、禁用8005端口;

    <Server port="-1" shutdown="SHUTDOWN">
    

    (4) 隐藏版本信息:

    <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
    
    Server="SOME STRING"   #加上自定义字符串
    

    九、JVM常用的分析工具:

    JVM的分析工具有:
    jps:用来查看运行的所有jvm进程;
    jinfo:查看进程的运行环境参数,主要是jvm命令行参数;
    jstat:对jvm应用程序的资源和性能进行实时监控;
    jstack:查看所有线程的运行状态;
    jmap:查看jvm占用物理内存的状态;
    jconsole:图形界面,是一个内置 Java 性能分析器,对资源消耗和性能进行监控;
    jvisualvm:图形界面,用来监控JVM的运行情况的插件;
    1、jps工具
    jps:Java虚拟机进程状态工具,
    格式:
    jps [-q] [-mlvV] [<hostid>]
    -q:静默模式;
    -v:显示传递给jvm的命令行参数;
    -m:输出传入main方法的参数;
    -l:输出main类或jar完全限定名称;
    -V:显示通过flag文件传递给jvm的参数;
    [<hostid>]:主机id,默认为localhost;

    2、jinfo工具
    jinfo:输出给定的java进程的所有配置信息;

    格式:
    jinfo [option] <pid>
    -flags:to print VM flags打印标志位
    -sysprops:to print Java system properties
    -flag <name>:to print the value of the named VM flag

    3、jstack工具
    jstack:查看指定的java进程的线程栈的相关信息;

    格式:
    jstack [-l] <pid>
    jstack -F [-m] [-l] <pid>
    -l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;
    -m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;
    -F:当使用“jstack -l PID"无响应,可以使用-F强制输出信息;

    谢谢阅读,如有错误烦请指正。

    ※部分文章来源于网络,如有侵权请联系删除;更多文章和资料|点击后方文字直达 ↓↓↓
    100GPython自学资料包
    阿里云K8s实战手册
    [阿里云CDN排坑指南]CDN
    ECS运维指南
    DevOps实践手册
    Hadoop大数据实战手册
    Knative云原生应用开发指南
    OSS 运维实战手册
    云原生架构白皮书
    Zabbix企业级分布式监控系统源码文档
    10G大厂面试题戳领

    相关文章

      网友评论

          本文标题:长文!Java容器Tomcat等中间价原理、安装、配置和使用

          本文链接:https://www.haomeiwen.com/subject/sxclektx.html