Loading

使用并了解Tomcat处理请求过程(二)

9. 部署应用

方案 部署java应用的方式 应用场景
1 Java代码放在tomcat站点目录下面(war包) 通用,需要准备tomcat
2 java代码生成jar包,通过java命令运行jar包(相当于集成tomcat功能) 更加方便,只需要准备好jdk就可以运行jar包

第1种方案就是把代码放到webapps下面,然后启动tomcat即可。
第2种方案 java -jar xxxx.jar


9.1 通过war包进行部署

将war包上传到tomcat目录下的webapps目录。

[root@web01 ~]# cd /app/tools/tomcat/webapps/
[root@web01 webapps]# ll
total 8
drwxr-x--- 15 root root 4096 Mar 27 23:17 docs
drwxr-x---  7 root root   99 Mar 27 23:17 examples
drwxr-x---  6 root root   79 Mar 27 23:17 host-manager
drwxr-x---  6 root root  114 Mar 27 23:17 manager
drwxr-x---  3 root root   41 Mar 28 02:44 memtest        #自动解压war包
-rw-r--r--  1 root root  643 Mar 28 02:44 memtest.war
drwxr-x---  3 root root  223 Mar 27 23:17 ROOT

访问测试,OK!

image-20230328144649359


9.2 通过jar包进行部署

将jar包上传或者从远程拉取到本地。

[root@web01 ~]# wget -O nginxWebUI.jar http://file.nginxwebui.cn/nginxWebUI-3.2.9.jar
--2023-03-28 02:49:01--  http://file.nginxwebui.cn/nginxWebUI-3.2.9.jar
Resolving file.nginxwebui.cn (file.nginxwebui.cn)... 222.186.52.86
Connecting to file.nginxwebui.cn (file.nginxwebui.cn)|222.186.52.86|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 39412890 (38M) [application/java-archive]
Saving to: ‘nginxWebUI.jar’

100%[======================================================>] 39,412,890   532KB/s   in 90s

2023-03-28 02:50:32 (428 KB/s) - ‘nginxWebUI.jar’ saved [39412890/39412890]

启动jar包

[root@web01 ~]# java -jar nginxWebUI.jar > /dev/null &
[1] 53293

访问测试,OK!

image-20230328150255022


10. Systemctl管理Tomcat

编辑配置文件/usr/lib/systemd/system/tomcat.service,修改/增加户都要systemctl daemon-reload 生效。


systemctl配置结构

[Unit]	指定注释信息,依赖(先后顺序)
Description	说明与注释
After	在这里指定的服务之后运行 network.target
[Service]	用于指定服务开启命令,关闭命令,重启命令
Type=notify	指定类型 simple或forking即可
ExecStart	服务启动命令
ExecStop	服务关闭命令
Reload	    重启命令
EnvironmentFile	配置环境变量的文件(一般对于编译安装,二进制安装需要加上)
[Install]	内容固定,用于指定运行级别
WantedBy=multi-user.target	运行级别

下面书写tomcat使用的systemctl配置文件

先创建一个变量文件/etc/sysconfig/tomcat,内容如下:

[root@web01 ~]# cat /etc/sysconfig/tomcat
JAVA_HOME=/app/tools/jdk
PATH=/app/tools/jdk/bin:/app/tools/jdk/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

编辑systemctl配置文件/usr/lib/systemd/system/tomcat.service

[root@web01 ~]# cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=java tomcat service
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/app/tools/tomcat/bin/startup.sh
ExecStop=/app/tools/tomcat/bin/shutdown.sh
Reload=/app/tools/tomcat/bin/shutdown.sh && sleep 3 && /app/tools/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target

重新加载systemd配置文件并使用tomcat

[root@web01 ~]# systemctl daemon-reload
[root@web01 ~]# ss -lntup | grep 8080

[root@web01 ~]# systemctl start tomcat
[root@web01 ~]# ss -lntup | grep 8080
tcp    LISTEN     0      100    [::]:8080               [::]:*                   users:(("java",pid=57916,fd=55))

[root@web01 ~]# systemctl stop tomcat
[root@web01 ~]# ss -lntup | grep 8080

11. Tomcat配置文件server.xml详解

<?xml version="1.0" encoding="UTF-8"?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素,它包含一个<Service>元素,并且它不能做为任何元素的子元素。
port指定Tomcat监听shutdown命令端口,终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令,该属性是必须的。
shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串,该属性必须设置。

不过基于安全角度的考虑,通常不允许远程进行。address="" 监听端口绑定的地址。如不指定,则默认为Localhost,即只能在localhost上发送SHUTDOWN命令;
-->
<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.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    
<!--开启tomcat认证功能, 管理端认证-->
  <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就能提供服务了。service组件中封装connector和container,它同时也表示将此service中的connector和container绑定起来,即由它们组成一个service向外提供服务。 

此service的显示名称,该名称主要用于在日志中进行标识service。一般来说无关紧要,默认为Catalina。
-->
  <Service name="Catalina">      

<!-- 
Connector:接收用户请求,类似于httpd的listen配置监听端口。
port:指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
protocol:连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。

minProcessors:服务器启动时创建的处理请求的线程数
maxProcessors:最大可以创建的处理请求的线程数
enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout:指定超时的时间数(以毫秒为单位)
-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
      
<!--
engine,核心容器组件,catalina引擎,负责通过connector接收用户请求并处理请求,将请求转至对应的虚拟主机host。
defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的。
-->
    <Engine name="Catalina" defaultHost="localhost">
        
<!--Realm表示存放用户名,密码及role的数据库-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

<!--
        Host表示一个虚拟主机
        name:指定主机名
        appBase:应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,也可以写绝对路径。
        unpackWARs:如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
        autoDeploy:在tomcat启动时,是否自动部署加载到jvm。
        xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
        xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。
-->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
          
          
<!--
配置日志信息
directory="logs"               指定tomcat访问日志目录
prefix="localhost_access_log"  访问日志文件名字的前部分
suffix=".txt"                  访问日志文件名字的后部分
pattern= "%h %l %u %t &quot;%r&quot; %s %b"   访问日志格式(&quot;表示双引号)
-->
        <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" />
<!-- 
%h 客户端ip地址
%t 时间
%r 请求起始行(方法 uri http)
%s 状态码
%b 资源大小
%{Referer}i 跳转
%{User-Agent}i 客户端
%{X-Forwarded-For}i 真实客户端ip
-->
      </Host>
    </Engine>
  </Service>
</Server>

Tips:其余详细配置可参考骏马金龙博主的文章,点这


12. Tomcat处理用户请求过程

<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
    
 <!-- 准备处理请求 -->
  <Connector port="8080" />   
    
 <!-- Engine 指定默认的站点 默认是www.yinjay.com -->
  <Engine name="Catalina" defaultHost="www.yinjay.com">
      
 <!-- 虚拟主机 -->
   <Host name="blog.yinjay.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Valve 指定日志格式,名字>
   </Host>
       
  <!-- 虚拟主机 -->
   <Host name="www.yinjay.com">
    <Valve 指定日志格式,名字>
   </Host>
  </Engine>
</Service>
</Server>
  1. 用户访问tomcat配置上的端口。
  2. Connector连接器用于接收客户端发送的请求。
  3. Engine从Connector上接收请求,并将请求给对应的虚拟主机进行处理。
  4. Host容器从Connector接收到请求进行分析后,将相关的属性参数传递给对应的(筛选方式是从请求首部的host字段和虚拟主机名称进行匹配)虚拟host进行处理。如果没有合适的虚拟主机,则传递给默认虚拟主机。
  5. 虚拟主机处理完后,返回完整的响应数据给connector。
  6. 最后通过connector将响应数据返回给客户端。

13. 使用虚拟主机功能

域名 站点目录 日志
www.yinjay.com /app/tools/tomcat/www tomcat主目录的logs目录下
zrlog.yinjay.com /app/tools/tomcat/webapps tomcat主目录的logs目录下

修改tomcat主目录下的conf目录的server.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


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

    <Engine name="Catalina" defaultHost="zrlog.yinjay.com">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

        <Host name="www.yinjay.com"  appBase="www" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
               prefix="www_access" suffix=".log"
               pattern="%h %l %u %t&quot;%r&quot; %s %b &quot;%{Referer}i&quot;&quot;%{User-Agent}i&quot; &quot;%{X-Forwarded-For}i&quot;" />
        </Host>

        <Host name="zrlog.yinjay.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
               prefix="zrlog_access" suffix=".log"
               pattern="%h %l %u %t&quot;%r&quot; %s %b &quot;%{Referer}i&quot;&quot;%{User-Agent}i&quot; &quot;%{X-Forwarded-For}i&quot;" />
        </Host>
    </Engine>
  </Service>
</Server>

Tips:没有定义任何context,将以appBase下的ROOT作为默认处理路径!

定义了path但没有定义docBase属性时,docBase将根据path推断出它的路径。例如添加下列Context,这路径为Host中的appBase路径 www/xuexi


重启Tomcat

systemctl restart tomcat

www目录创建测试文件

mkdir -p /app/tools/tomcat/www/ROOT
echo www tomcat > /app/tools/tomcat/www/ROOT/index.jsp

下面下载一个java博客war包,点这!。将war上传到/app/tools/tomcat/webapps目录下。

#上传war包到指定目录,已自动解压
[root@web01 ~]# cd /app/tools/tomcat/webapps/
[root@web01 webapps]# ll
total 10988
drwxr-x--- 15 root root     4096 Mar 27 23:17 docs
drwxr-x---  7 root root       99 Mar 27 23:17 examples
drwxr-x---  6 root root       79 Mar 27 23:17 host-manager
drwxr-x---  6 root root      114 Mar 27 23:17 manager
drwxr-x---  3 root root       41 Mar 28 02:44 memtest
-rw-r--r--  1 root root      643 Mar 28 02:44 memtest.war
drwxr-x---  3 root root      223 Mar 27 23:17 ROOT
drwxr-x---  9 root root      126 Mar 29 03:54 zrlog-2.2.1-efbe9f9-release
-rw-r--r--  1 root root 11243048 Mar 29 03:54 zrlog-2.2.1-efbe9f9-release.war
[root@web01 webapps]# mv zrlog-2.2.1-efbe9f9-release zrlog

#将zrlog目录中所有文件移至ROOT目录下
[root@web01 webapps]# rm -rf ROOT/*
[root@web01 webapps]# mv zrlog/* ROOT/

在MariaDB数据库上进行创建zrlog数据库和创建授权用户。

create database zrlog;
grant all on zrlog.* to 'zrlog'@'172.16.1.%' identified by 'Huawei@123';
flush privileges;

访问zrlog.yinjay.com:8080,进行安装!

image-20230329160112612


posted @ 2023-09-17 10:28  YinJayChen  阅读(51)  评论(0编辑  收藏  举报