使用并了解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!
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!
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 "%r" %s %b" 访问日志格式("表示双引号)
-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %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>
- 用户访问tomcat配置上的端口。
- Connector连接器用于接收客户端发送的请求。
- Engine从Connector上接收请求,并将请求给对应的虚拟主机进行处理。
- Host容器从Connector接收到请求进行分析后,将相关的属性参数传递给对应的(筛选方式是从请求首部的host字段和虚拟主机名称进行匹配)虚拟host进行处理。如果没有合适的虚拟主机,则传递给默认虚拟主机。
- 虚拟主机处理完后,返回完整的响应数据给connector。
- 最后通过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"%r" %s %b "%{Referer}i""%{User-Agent}i" "%{X-Forwarded-For}i"" />
</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"%r" %s %b "%{Referer}i""%{User-Agent}i" "%{X-Forwarded-For}i"" />
</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,进行安装!
作者:YinJay
Email:szgetshell@163.com