zoukankan      html  css  js  c++  java
  • web服务之Tomcat管理配置

    应用部署实现

    WebApp应用的归档格式

    .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
    .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
    .rar:资源适配器类打包文件,目前已不常用
    .ear:企业级WebApp打包,目前已不常用
    

    传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动解包展开和部署上线。

    #conf/server.xml中文件配置
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    

    部署方式

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

    部署WebApp的目录结构

    常见开发项目目录组成

    #目录结构一般由开发用工具自动生成,以下模拟生成相关目录
    [root@centos8 tomcat]#  mkdir projects/myapp/{WEB-INF,META-INF,classes,lib} -pv
    mkdir: 已创建目录 "projects"
    mkdir: 已创建目录 "projects/myapp"
    mkdir: 已创建目录 "projects/myapp/WEB-INF"
    mkdir: 已创建目录 "projects/myapp/META-INF"
    mkdir: 已创建目录 "projects/myapp/classes"
    mkdir: 已创建目录 "projects/myapp/lib"
    
    #常见应用首页,内容就用前面的test.jsp内部
    [root@centos8 tomcat]#  vi projects/myapp/index.jsp
    
    #手动复制项目目录到webapps目录下去
    [root@centos8 tomcat]#  cp -r projects/myapp/ /usr/local/tomcat/webapps/
    
    #注意权限和属性
    [root@centos8 tomcat]# chown -R tomcat.tomcat /usr/local/tomcat/webapps/myapp
    
    #访问http://YourIP:8080/myapp/
    

    案例:手动的应用部署

    部署主页目录下的应用WebApp

    [root@centos8 tomcat]# vim webapps/ROOT/test.jsp
    [root@centos8 tomcat]# cat webapps/ROOT/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>
    
    [root@centos8 tomcat]# curl http://127.0.0.1:8080/test.jsp
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    hello jsp
    <br>
    http://127.0.0.1:8080/test.jsp
    </body>
    </html>
    [root@centos8 tomcat]#tree work/Catalina/localhost/ROOT/
    work/Catalina/localhost/ROOT/
    └── org
        └── apache
            └── jsp
                ├── test_jsp.class
                └── test_jsp.java
    3 directories, 2 files
    [root@centos8 tomcat]#
    

    部署一个子目录的应用WebApp

    [root@centos8 tomcat]# pwd
    /usr/local/tomcat
    [root@centos8 tomcat]# mkdir webapps/app1/
    #利用之前实验的文件生成新应用
    [root@centos8 tomcat]# cp -p webapps/ROOT/test.jsp webapps/app1/
    [root@centos8 tomcat]# chown -R tomcat.tomcat webapps/app1/
    [root@centos8 tomcat]# tree webapps/app1/
    webapps/testapp1/
    └── test.jsp
    0 directories, 1 file
    [root@centos8 tomcat]# curl http://127.0.0.1:8080/app1/test.jsp
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    hello jsp
    <br>
    <%=request.getRequestURL()%>
    </body>
    </html>
    
    [root@centos8 tomcat]# tree work/Catalina/localhost/app1/
    work/Catalina/localhost/app1/
    └── org
        └── apache
            └── jsp
                ├── test_jsp.class
                └── test_jsp.java
    3 directories, 2 files
    [root@centos8 tomcat]#
    #删除应用
    [root@centos8 tomcat]# rm -rf webapps/app1/
    [root@centos8 tomcat]# ls webapps/
    docs examples host-manager manager ROOT
    [root@centos8 tomcat]# ls work/Catalina/localhost/
    docs examples host-manager manager ROOT
    

    基于WEB的管理Server status和Manager APP实现应用部署

    tomcat 提供了基于WEB的管理页面,默认由 tomcat-admin-webapps.noarch包提供相关文件

    实现WEB的管理Server status和Manager APP

    打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示默认的管理页面被禁用,启用方法如下

    [root@centos8 tomcat]# ls conf/
    Catalina context.xml logging.properties tomcat-users.xml
    catalina.policy jaspic-providers.xml server.xml tomcat-users.xsd
    catalina.properties jaspic-providers.xsd tomcat.conf web.xml
    #查看配置信息
    [root@centos8 tomcat]# cat conf/server.xml
    <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,我们需要一个角色managergui

    [root@centos8 tomcat]# vim conf/tomcat-users.xml
    <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="admin" password="123456" roles="manager-gui"/>
    </tomcat-users>
    
    #修改全局配置文件需要重启服务生效
    [root@centos8 tomcat]# systemctl restart 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.CsrfPreve
    ntionFilter$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|172..d+.d+"
    

    范例:

    [root@centos8 tomcat]# vim webapps/manager/META-INF/context.xml
    <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|172.31.0.d+" />
      <Manager sessionAttributeValueClassNameFilter="java.lang.
    (?:Boolean|Integer|Long|Number|String)|org.apach
    e.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.
    (?:Linked)?HashMap"/>
    </Context>
    #修改WebApp的配置无需重启服务即可生效
    

    再次通过浏览器访问两个按钮Server Status和Manager App,可以看到以下管理界面,输入前面的用户和密码进行登录

    基于WEB应用程序管理器实现APP的部署

    Web 应用程序管理界面可以实现以下功能
    Applications 应用程序管理,可以启动、停止、重加载、反部署、清理过期session
    Deploy 可以热部署,也可以部署war文件。

    方式1: 指定目录部署软件
    [root@centos8 ~]# mkdir -p /data/myapp/
    [root@centos8 ~]# echo /data/myapp/index.html > /data/myapp/index.html
    
    #按下面信息添写,实现下面链接的访问
    http://172.31.0.8:8080/test1/
    
    #自动将/data/myapp目录下的数据复制到webapps/test1下面
    [root@centos8 ~]# tree /usr/local/tomcat/webapps/test1/
    /usr/local/tomcat/webapps/test1/
    └── index.html
    0 directories, 1 file
    [root@centos8 ~]# cat /usr/local/tomcat/webapps/test1/index.html
    /data/myapp/index.html
    

    方式2: 部署war包文件

    常见配置详解

    端口8005/tcp 安全配置管理

    在conf/server.xml 有以下内容

    <?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>
    
    <Server port="8005" shutdown="SHUTDOWN">
    

    8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个
    字符串,tomcat接收到后就会关闭此Server。
    此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现
    或者port修改成 0, 会使用随机端口,如:36913

    生产环境推荐使用:port设为-1等无效端口,将关闭此功能

    此行不能被注释,否则无法启动tomcat服务

    范例:

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

    范例:修改8005/tcp端口管理命令

    [root@centos8 ~]#ss -ntl
    State Recv-Q Send-Q Local Address:Port
    Peer Address:Port
    LISTEN 0 128 0.0.0.0:22  0.0.0.0:*
    LISTEN 0 100 *:8080      *:*
    LISTEN 0 128 [::]:22     [::]:* 
    LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* 
    LISTEN 0 100 *:8009 *:*
    [root@centos8 ~]# telnet 127.0.0.1 8005
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    SHUTDOWN #执行命令关闭tomcat
    Connection closed by foreign host.
    

    显示指定的http服务器版本信息

    默认不显示tomcat的http的Server头信息, 可以指定tomcat的http的Server头信息为相应的值

    #conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
    redirectPort="8443" Server="SOME STRING"/>
    

    其它配置

    conf/server.xml中可以配置service,connector, Engine,Host等

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

    <Service name="Catalina">
    

    连接器配置

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

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

    引擎配置

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

    defaultHost 配置

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

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

    多虚拟主机配置

    多虚拟主机配置说明

    name 必须是主机名,用主机名来匹配
    appBase 当前主机的网页根目录,是相对于$CATALINA_HOME ,也可以使用绝对路径
    unpackWARs 是否自动解压war格式
    autoDeploy 热部署,自动加载并运行应用
    

    虚拟主机配置过程

    再添加和配置一个新的虚拟主机,并将myapp部署到/data/webapps目录下

    [root@tomcat ~]# vim conf/server.xml
    #在文件最后面增加下面内容
    <Host name="web1.magedu.org" appBase="/data/webapps/" unpackWARs="True"
    autoDeploy="false">
    
    #虚拟主机专有访问日志
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="web1_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s
    %b" />
    </Host>
    
    #以下行是自带的不需要修改
    </Engine>
    </Service>
    </Server>
    #或者如果不加日志也可以用下面简化写法
    <Host name="web1.llongxuan.vip" appBase="/data/webapps/" unpackWARs="True"
    autoDeploy="false"/>
    

    准备虚拟主机的数据目录

    常见虚拟主机根目录
    # [root@tomcat ~]# mkdir /data/webapps/ROOT -pv
    #[root@tomcat ~]#  chown -R tomcat.tomcat /data/webapps
    # [root@tomcat ~]# echo web1.longxuan.vip > /data/webapps/ROOT/index.html
    

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

    案例:tomcat实现多虚拟主机

    [root@centos8 tomcat]# pwd
    /usr/local/tomcat
    [root@centos8 tomcat]# vim conf/server.xml
    [root@centos8 tomcat]# tail conf/server.xml
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
    #添加了以下四行
        <Host name="node1.longxuan.vip" appBase="/data/webapps1">
        </Host>
        <Host name="node2.longxuan.vip" appBase="/data/webapps2">
        </Host>
    </Engine>
    </Service>
    </Server>
    
    #对每个虚拟主机,准备数据
    [root@centos8 ~]# mkdir /data/webapps{1,2}/ROOT -pv
    mkdir: created directory '/data/webapps1/ROOT'
    mkdir: created directory '/data/webapps2/ROOT'
    [root@centos8 ~]# cat /data/webapps1/ROOT/index.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>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <br>
    <%=request.getRequestURL()%>
    </body>
    </html>
    [root@centos8 ~]# cat /data/webapps2/ROOT/index.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>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <br>
    <%=request.getRequestURL()%>
    </body>
    </html>
    
    
    #设置权限
    [root@centos8 ~]# chown -R tomcat.tomcat /data/webapps{1,2}/
    

    测试

    [root@centos8 ~]# curl http://node1.longxuan.vip:8080/
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    http://node1.longxuan.vip:8080/
    
    </body>
    </html>
    [root@centos8 ~]# curl http://node2.longxuan.vip:8080/
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    http://node2.mlongxuan.vip:8080/
    </body>
    </html>
    

    案例:修改tomcat实现多虚拟主机的端口为80

    [root@centos8 ~]# vim /usr/local/tomcat/conf/server.xml
    <Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
    #注意: 因为以tomcat用户运行,不能直接使用1024以下的端口,需要修改tomcat的运行身份,否则会出现下面错误
    [root@centos8 ~]# tail -f /usr/local/tomcat/logs/catalina.out
    Caused by: java.net.SocketException: Permission denied
    
    [root@centos8 ~]# vim /lib/systemd/system/tomcat.service
    [Service]
    .....
    #User=tomcat
    #Group=tomcat
    [root@centos8 ~]# systemctl daemon-reload
    [root@centos8 ~]# systemctl restart tomcat
    

    基于web方式的Host Manager虚拟主机管理

    可以通过tomcat的管理页面点下面Host Manager按钮进入管理虚拟主机的页面,默认Host Manager 管理页被禁用

    允许本机访问配置如下

    [root@centos8 tomcat]# vim conf/tomcat-users.xml
    <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"/> #3.4.4.6添加的内容
        <role rolename="admin-gui" /> #添加新的role
        <user username="admin" password="123456" roles="manager-gui,admin-gui"/> #再加新role
    </tomcat-users>
    
    [root@centos8 tomcat]# systemctl restart tomcat
    

    重启Tomcat后,点击"Host Manager"按钮

    允许远程主机访问

    但通过远程访问地址仍无法访问Host Manager管理页面
    默认无法通过网络远程访问Host Manager管理页面

    [root@centos8 tomcat]# vim webapps/host-manager/META-INF/context.xml
    <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|172.31.0.d+" />
        <Manager sessionAttributeValueClassNameFilter="java.lang.
    (?:Boolean|Integer|Long|Number|String)|org.apach
    e.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.
    (?:Linked)?HashMap"/>
    </Context>
    

    无需重启服务,直接访问,输入前面的用户和密码,即可登录成功

    创建新的虚拟主机

    可以管理虚拟主机

    #创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功
    [root@centos8 ~]# mkdir /data/node1/ROOT/
    [root@centos8 ~]# echo node1.longxuan.vip > /data/node1/ROOT/index.html
    [root@centos8 ~]# chown -R tomcat.tomcat /data/node1/
    

    Context 配置

    Centext 配置方式

    Context作用:

    路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
    应用独立配置,例如单独配置应用日志、单独配置应用访问控制

    #映射指定路径
    <Context path="/test" docBase="/data/test" reloadable="true" />
    #映射站点的根目录
    <Context path="/" docBase="/data/website" reloadable="true" />
    #还可以添加日志等独立的配置
    <Context path="/test" docBase="/data/test" reloadable="true" >
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_test_log" suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Context>
    

    说明:

    path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径
    优先更高
    docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
    reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB
    应用重新加载。生产环境中,建议使用false来禁用。
    

    Centext实现过程

    将~/projects/myapp/下面的项目文件复制到/data/下,可以修改一下index.jsp 区别一下

    [root@centos8 ~]# cp -r ~/projects/myapp /data/myapp-v1
    [root@centos8 ~]# vim /data/myappv1/index.jsp
    [root@centos8 ~]# cd /data
    [root@centos8 ~]# ln -sv myapp-v1 test
    

    注意:这里特别使用了软链接,原因方便后期版升级或回滚,如是是版本升级,需要将软链接指向
    myappv2,重新启动。如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就可以实现回滚

    修改conf/server.xml设置context
    Tomcat的配置文件server.xml中修改如下,重启Tomcat生效

    <Host name="node1.ongxuan.vip" appBase="/data/webapps"
            unpackWARs="true" autoDeploy="true" >
        <Context path="/test" docBase="/data/test" reloadable="true" />
    </Host>
    

    测试
    使用http://node1.longxuan.vip:8080/test/

    Valve组件

    valve(阀门)组件可以定义日志

    <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" />
    

    valve存在多种类型:

    定义访问日志:org.apache.catalina.valves.AccessLogValve
    定义访问控制:org.apache.catalina.valves.RemoteAddrValve
    

    示例:

    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    deny="172.31.0.d+"/>
    

    案例范例:虚拟主机上利用context实现虚拟目录

    #在前面范例的基础上实现,继续创建node1.longxuan.vip虚拟主机下的物理子目录
    [root@centos8 ~]# mkdir /data/webapps1/app1/
    [root@centos8 ~]# echo /data/webapps1/app1/index.html >
    /data/webapps1/app1/index.html
    
    [root@centos8 ~]# curl http://node1.longxuan.vip:8080/app1/
    /data/webapps1/app1/index.html
    
    #利用context实现node1.longxuan.vip虚拟主机下的虚拟子目录
    [root@centos8 tomcat]# vim conf/server.xml
    [root@centos8 tomcat]# tail conf/server.xml
        </Host>
        <Host name="node1.longxuan.vip" appBase="/data/webapps1">
    #加下面六行
        <Context path="/app1" docBase="/data/app1" reloadable="true" >
          <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="node1.longxuan.vip_app1" suffix=".log"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="171.31.0.7"/>
        </Context>
        </Host>
        <Host name="node2.longxuan.vip" appBase="/data/webapps2">
        </Host>
       </Engine>
     </Service>
    </Server>
    
    [root@centos8 tomcat]# systemctl restart tomcat
    #因数据没有准备好,出现下面错误
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
    #准备数据目录
    [root@centos8 tomcat]# mkdir /data/app1-v1
    [root@centos8 tomcat]# echo /data/app1-v1/index.html > /data/app1-v1/index.html
    [root@centos8 tomcat]# ln -s /data/app1-v1/ /data/app1
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
    
    #数据目录准备好,还需要重新启动服务,才能访问
    [root@centos8 tomcat]# systemctl restart tomcat
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    /data/app1-v1/index.html
    [root@centos7 ~]# curl -I http://node1.longxuan.vip:8080/app1/
    HTTP/1.1 403
    Content-Type: text/html;charset=utf-8
    Content-Language: en
    Transfer-Encoding: chunked
    Date: Tue, 14 Jul 2021 06:48:54 GMT
    
    #可以看到此目录单独的访问日志
    [root@centos8 ~]# cat /usr/local/tomcat/logs/node1.magedu.org_app1.2021-06-14.log
    172.31.0.8 - - [14/Jul/2021:14:36:01 +0800] "GET /app1/ HTTP/1.1" 200 330
    172.31.0.7 - - [14/Jul/2021:14:48:07 +0800] "GET /app1/ HTTP/1.1" 403 618
    

    范例: 基于前面环境,实现软件升级和回滚功能

    #升级版本
    [root@centos8 tomcat]# mkdir /data/app1-v2
    [root@centos8 tomcat]# echo /data/app1-v2/index.html > /data/app1-v2/index.html
    [root@centos8 tomcat]# rm -f /data/app1
    
    #删除软链接,仍然可以访问旧版本
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    /data/app1-v1/index.html
    
    #重新服务后,出现错误
    [root@centos8 tomcat]# systemctl restart tomcat
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
    
    #新建软链接,指向新版,仍需重启服务才生效
    [root@centos8 tomcat]# ln -s /data/app1-v2/ /data/app1
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
    [root@centos8 tomcat]# systemctl restart tomcat
    [root@centos8 tomcat]# curl http://node1.mlongxuan.vip:8080/app1/
    /data/app1-v2/index.html
    
    #软件降级或回滚
    [root@centos8 tomcat]# rm -f /data/app1
    [root@centos8 tomcat]# ln -s /data/app1-v1/ /data/app1
    [root@centos8 tomcat]# systemctl restart tomcat
    [root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
    /data/app1-v1/index.html
    
  • 相关阅读:
    《算法竞赛进阶指南》0x12 队列 POJ2259 Team Queue
    《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559
    《算法竞赛进阶指南》0x11 栈 求解中缀表达式
    19.职责链模式(Chain of Responsibility Pattern)
    16.观察者模式(Observer Pattern)
    17.解释器模式(Interpreter Pattern)
    15. 迭代器模式(Iterator Pattern)
    14.命令模式(Command Pattern)
    12.代理模式(Proxy Pattern)
    13.模板方法(Template Method)
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/15168153.html
Copyright © 2011-2022 走看看