zoukankan      html  css  js  c++  java
  • 二、tomcat的主配置文件详解

    一、tomcat的目录结构

     
    [root@tomcat ~]# cd /usr/local/tomcat/
    [root@tomcat tomcat]# tree -L 1
    .
    ├── bin       #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)
    ├── conf      #→用以配置Tomcat的XML及DTD文件
    ├── lib       #→存放web应用能访问的JAR包
    ├── LICENSE
    ├── logs      #→Catalina和其它Web应用程序的日志文件
    ├── NOTICE
    ├── RELEASE-NOTES
    ├── RUNNING.txt
    ├── temp     #→临时文件
    ├── webapps   #→Web应用程序根目录
    └── work      #→用以产生有JSP编译出的Servlet的.java和.class文件
    7 directories, 4 files
    
    [root@tomcat tomcat]# cd webapps/
    [root@tomcat webapps]# ll
    total 20
    drwxr-xr-x 14 root root 4096 Oct 5 12:09 docs         #→tomcat帮助文档
    drwxr-xr-x 6 root root 4096 Oct 5 12:09 examples      #→web应用实例
    drwxr-xr-x 5 root root 4096 Oct 5 12:09 host-manager  #→管理
    drwxr-xr-x 5 root root 4096 Oct 5 12:09 manager       #→管理
    drwxr-xr-x 3 root root 4096 Oct 5 12:09 ROOT          #→默认网站根目录

    二、tomcat的配置文件及组件说明

    组件分类

    顶级组件
    Server,代表整个Tomcat容器
    服务类组件
    Service,组织Engine和Connector,里面只能包含一个Engine
    连接器组件
    Connector,有HTTP、HTTPS、A JP协议的连接器
    容器类
    Engine、Host、Context都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
    内嵌类
    可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组
    件内定义。
    集群类组件
    listener、cluster

    tomcat的构建组成

    名称                 说明
    Server              Tomcat运行的进程实例
    Connector           负责客户端的HTTP、HTTPS、A JP等协议的连接。一个Connector只属于某一个Engine              
    Service             用来组织Engine和Connector的关系
    Engine              响应并处理用户请求。一个引擎上可以绑定多个Connector
    Host                虚拟主机
    Context             应用的上下文,配置路径映射path => directory
    
    AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议,apache私有协议。

    核心组件

    1、Tomcat启动一个Server进程。可以启动多个Server,但一般只启动一个
    2、创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
       1)每个Service中,是Engine和其连接器Connector的关联配置
    3、可以为这个Server提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
    3、Service内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
       1)Engine对请求头做了分析,将请求发送给相应的虚拟主机
       2)如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
       3)Engine上的缺省虚拟主机可以修改
    4、Host定义虚拟主机,虚拟主机有name名称,通过名称匹配
    5、Context定义应用程序单独的路径映射和配置
    <?xml version="1.0" encoding="UTF-8"?>
    <Server port="8005" shutdown="SHUTDOWN">
      <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" />
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        <Engine name="Catalina" defaultHost="localhost">
          <Host name="localhost" appBase="webapps" 
                unpackWARs="true" autoDeploy="true">
          </Host>
        </Engine>
      </Service>
    </Server>

    假设来自客户的请求为http://localhost:8080/test/index.jsp

    1、hosts/DNS域名解析
    2、浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
    3、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
    4、Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
    5、Engine匹配到名为localhost的Host。即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机
    6、localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context 
    7、Host匹配到路径为/test的Context
    8、path=/test的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet
    9、Context匹配到URL PATTERN为*.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
    10、Context把执行完了之后的HttpServletResponse对象返回给Host
    11、Host把HttpServletResponse对象返回给Engine
    12、Engine把HttpServletResponse对象返回给Connector
    13、Connector把HttpServletResponse对象返回给浏览器端

    三、tomcat的应用部署介绍

    1、根目录

    Tomcat中默认网站根目录是CATALINA_BASE/webapps/ROOT 在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。

    nginx 假设在nginx中部署2个网站应用eshop、bbs,假设网站根目录是/var/www/html,那么部署可以是这样的。 eshop解压缩所有文件放到/var/www/html/目录下。 bbs的文件放在/var/www/html/bbs下。

    Tomcat Tomcat中默认网站根目录是CATALINA_BASE/webapps/ 在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。 将eshop解压后的文件放到这个ROOT中。 bbs解压后文件都放在CATALINA_BASE/webapps/bbs目录下。

    特别注意:bbs与ROOT在同一级平行目录下。

    每一个虚拟主机的目录都可以使用appBase配置自己的站点目录,里面都可以使用ROOT目录作为主站 目录。

    2、JSP WebApp目录结构

    1)主页配置:一般指定为index.jsp或index.html 2)WEB-INF/:当前WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件 3)META-INF/:类似于WEB-INF 4)classes/:类文件,当前webapp需要的类 5)lib/:当前应用依赖的jar包

    案例介绍

    默认/usr/local/tomcat/conf/web.xml中定义了访问页面的顺序

    cat /usr/local/tomcat/conf/web.xml
    ......
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    ......
    默认的顺序为index.html-->index.htm-->index.jsp

    可以在网站根目录中/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml修改,默认/usr/local/tomcat/conf/web.xml

    cat /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
    ......
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>       
        </welcome-file-list>
    ......
    该文件的优先级高于/usr/local/tomcat/conf/web.xml文件
    顺序为index.jsp-->index.html-->index.htm

    3、webapp归档格式

    .war:WebApp打包

    .jar:EJB类打包文件

    .rar:资源适配器类打包文件

    .ear:企业级WebApp打包

    传统应用开发测试后,通常打包为war格式,这种文件部署到了Tomcat的webapps下,还可以自动展开。

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
         域名                 网站根路径            自动解压         自动部署

    4、部署Deploy

    部署:将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上。
           自动部署Auto Deploy:Tomcat发现多了这个应用就把它加载并启动起来
           手动部署
               冷部署:将webapp放到指定目录,才去启动Tomcat
               热部署:Tomcat服务不停止,需要依赖manager、ant脚本、tcd(tomcat clientdeployer)等工具
    反部署undeploy:停止webapp的运行,并从JVM上清除已经加载的类,从Tomcat应用目录中移除部署的文件
    启动start:是webapp能够访问
    停止stop:webapp不能访问,不能提供服务,但是JVM并不清除它

    5、简单案例

    案例1:添加一个文件,test.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <%
    out.println("hello jsp");
    %>
    <br>
    <%=request.getRequestURL()%>
    </body>
    </html>

    先把test.jsp放到ROOT下去,试试看,访问http://YourIP:8080/test.jsp 立即可以看到,这是通过路径映射找到相应的test.jsp后,转换成test_jsp.java,在编译成 test_jsp.class。 /usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp下有转换后的文件。

    案例2:添加一个应用 模拟部署一个应用

    # cd
    常见开发项目目录组成
    # mkdir projects/myapp/{WEB-INF,classes,lib} -pv
    mkdir: 已创建目录 "projects"
    mkdir: 已创建目录 "projects/myapp"
    mkdir: 已创建目录 "projects/myapp/WEB-INF"
    mkdir: 已创建目录 "projects/myapp/classes"
    mkdir: 已创建目录 "projects/myapp/lib"
    常见应用首页,内容就用上面的test.jsp
    # vi projects/myapp/index.jsp
    手动复制项目目录到webapps目录下去
    # cp -r projects/myapp/ /usr/local/tomcat/webapps/
    使用http://YourIP:8080/myapp/访问试试看

    四、配置文件说明

    server.xml实例

    <Server port="8005" shutdown="SHUTDOWN">
     <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
     <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
     <Listener className="org.apache.catalina.core.JasperListener" />
     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
     <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
     <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
    <GlobalNamingResources>
      <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>
    
    <Service name="Catalina">
      <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     <Engine name="Catalina" defaultHost="localhost">
       <Realm className="org.apache.catalina.realm.LockOutRealm">
          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
       </Realm>
    
       <Host name="localhost"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
           <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       </Host>
      </Engine>
     </Service>
    </Server>

    1.1 8005端口说明

    <Server port="8005" shutdown="SHUTDOWN">
    8005是Tomcat的管理端口,默认监听在127.0.0.1上。SHUTDOWN这个字符串接收到后就会关闭此Server。

    使用8005端口来关闭tomcat

    [root@node1 ~]# ps -ef |grep tomcat
    java     14917     1  0 04:33 ?        00:00:09 /usr/java/default/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/localtomcat/temp org.apache.catalina.startup.Bootstrap start
    root     18260 17136  0 05:39 pts/0    00:00:00 grep --color=auto tomcat
    
    [root@node1 ~]# telnet 127.0.0.1 8005
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    SHUTDOWN
    Connection closed by foreign host.
    
    [root@node1 ~]# ps -ef |grep tomcat
    root     18290 17136  0 05:40 pts/0    00:00:00 grep --color=auto tomcat

    这个管理功能建议禁用,改shutdown为一串猜不出的字符串。

    <Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">

    1.2 用户认证及权限

     
    <GlobalNamingResources>
    <!-- Editable user database that can also be used by
    UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>

    用户认证,配置文件是conf/tomcat-users.xml。 打开tomcat-users.xml,我们需要一个角色manager-gui。

     
    <tomcat-users xmlns="http://tomcat.apache.org/xml"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
               version="1.0">
      <role rolename="manager-gui"/>
      <user username="ywx" password="123456" roles="manager-gui"/>
    </tomcat-users>

    Tomcat启动加载后,这些内容是常驻内存的。如果配置了新的用户,需要重启Tomcat。

    用户权限配置

    文件路径/usr/local/tomcat/webapps/manager/META-INF/context.xml

     
    <?xml version="1.0" encoding="UTF-8"?>
    <Context antiResourceLocking="false" privileged="true" >
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
    <Manager sessionAttributeValueClassNameFilter="java.lang.
    (?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionF
    ilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
    </Context>

    看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则为

    allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1|192.168.d+.d+"

    可以访问管理页面

    1.3 定义server

    <Service name="Catalina">

    一般情况下,一个Server实例配置一个Service,name属性相当于该Service的ID。

    <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443" />

    链接器配置。

    redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差。

     

    <Engine name="Catalina" defaultHost="localhost">

    引擎配置。

    defaultHost指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost。

     

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

    虚拟主机配置。 name必须是主机名,用主机名来匹配。

    appBase,当前主机的网页根目录,是相对于CATALINA_HOME,也可以使用绝对路径

    unpackWARs是否自动解压war格式 a

    utoDeploy 热部署,自动加载并运行应用

     

    1.4、虚拟主机配置实验

    尝试再配置一个虚拟主机,并将myapp部署到/data/webapps目录下

    <Host name="node1.magedu.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true" />
    常见虚拟主机根目录
    # mkdir /data/webapps -pv
    mkdir: 已创建目录 "/data"
    mkdir: 已创建目录 "/data/webapps"
    # cp -r ~/projects/myapp/ /data/webapps/ROOT
    # pwd
    /usr/local/tomcat
    # bin/shutdown.sh
    # bin/startup.sh

    刚才在虚拟主机中主机名定义www.ywx.com,所以需要主机在本机手动配置一个域名解析。 如果是windows,修改在C:WindowsSystem32driversetc下的hosts文件,需要管理员权限。 使用http://www.ywx.com访问试试看。

     

    1.5 Context配置

    Context作用:

    1) 路径映射

    2) 应用独立配置,例如单独配置应用日志、单独配置应用访问控制

    <Context path="/test" docBase="/data/test" reloadable="false" />

    path指的是访问的路径

    docBase,可以是绝对路径,也可以是相对路径(相对于Host的appBase)

    reloadable,true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用 重新加载,性能消耗很大。生成环境中,会使用false来禁用。

    将~/projects/myapp/下面的项目文件复制到/data/下

    # cp -r ~/projects/myapp /data/myappv1
    # cd /data
    # ln -sv myappv1 test

    可以修改一下index.jsp好区别一下。 Tomcat的配置文件server.xml中修改如下

    <Host name="www.ywx.com" appBase="/data/webapps"
          unpackWARs="true" autoDeploy="true" >
      <Context path="/test" docBase="/data/test" reloadable="false" />
    </Host>

    使用http://www.ywx.com:8080/test 注意:这里特别使用了软链接,原因就是以后版本升级,需要将软链接指向myappv2,重启Tomcat。 如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就可以实现回滚。

     

     

  • 相关阅读:
    springboot: 使web项目支持jsp
    springboot: 集成freemark模板引擎
    Springboot的优点和实现
    Spring的两种动态代理:Jdk和Cglib 的区别和实现
    JAVA单例模式:懒汉式,饿汉式
    java的内存管理 对象的分配与释放
    JAVA反射调用方法
    JAVA内置注解 基本注解
    图——图的定义与操作
    树——二叉树的线索化
  • 原文地址:https://www.cnblogs.com/yaokaka/p/14256752.html
Copyright © 2011-2022 走看看