tomcat的部署与实践
关于什么是tomcat,其作用又是啥,我这里就不做过多的解释了,感兴趣的同学可以参考我其他文章或者其他优秀博客。我们这里直入主题。
1.安装前准备
我们先去tomcat官网https://tomcat.apache.org 下载我们需要的tomcat版本。我们这里选择tomcat8.5.50版本,如下图
点击上面的版本依赖,我们会看到下图,从图中我们可以看到tomcat安装依赖java环境,我们这里下载的版本依赖jdk7或者更高的jdk版本。
tomcat下载好之后我们通过xftp把包导入到我们的虚拟机上去,接下来用。
在介绍安装之前,我们来看一下我们的系统环境
[root@centos7 conf]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@centos7 conf]# uname -a Linux centos7.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [root@centos7 conf]# systemctl stop firewalld.service #这里是关闭centos7的防火墙 [root@centos7 conf]# systemctl disable firewalld.service [root@centos7 conf]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) Feb 11 17:42:40 centos7.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon... Feb 11 17:42:43 centos7.localdomain systemd[1]: Started firewalld - dynamic firewall daemon. Feb 11 18:40:23 centos7.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon... Feb 11 18:40:23 centos7.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon. [root@centos7 conf]# setenforce 0 #这里是临时关闭selinux [root@centos7 conf]# getenforce Permissive [root@centos7 conf]#
好了接下我们介绍tomcat的安装方式,目前tomcat主流的安装方式是yum安装和压缩包安装的方式。下面我就来讲解这两种方式;
2.安装方式:
1.yum安装的方式:
从上面的介绍我们可以看出tomcat的部署依赖java环境,不同版本的依赖不同版本的jdk版本,我这里通过yum的方式安装tomcat(默认安装的是tomcat7左右的版本,这个在下面会验证),安装的时候会默认帮我们解决java环境依赖,不过这里他们帮我们配置的是openjdk版本的,我这里不太建议使用openjdk,我这里一般都会先配置好oracle jdk版本的java环境,具体怎么配置,可以参考我的https://www.cnblogs.com/qingbaizhinian/p/12201073.html这篇文章。好了,我们下面来演示怎么用yum源部署tomcat。
[root@centos7 ~]# yum install tomcat tomcat-admin-webapps tomcat-webapps -y (这里用yum源部署tomcat.不止要安装tomcat包,还需要安装管理包tomcat-admin-webapps tomcat-webapps
这里的管理包的作用我们后面有机会在讲,好了我们接下来验证一下yum源安装的tomcat是什么版本。
从这里我们看出yum源安装的是tomcat7左右的版本,版本较老。所以一般我不太建议yum源安装tomcat,这是根据个人喜好来的。好了我们现在卸载掉yum源安装的tomcat,卸载方法可以参考我其他文章。
2.压缩包安装的方式:
下面我来介绍一下tomcat的主流安装方式,通过官方的压缩包进行安装。
上面我已经在官网下载好压缩包,并以导入虚拟机了,我们现在来看一下。
好了我们开始我们tomcat的安装,步骤如下。
#解压安装tomcat
[root@centos7 ~]# tar -xf apache-tomcat-8.5.50.tar.gz -C /usr/local/ (-C参数可以指定安装目录)
[root@centos7 ~]# ln -sv /usr/local/apache-tomcat-8.5.50/ /usr/local/tomcat
#配置Tomcat环境
[root@centos7 ~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
[root@centos7 ~]# source /etc/profile
#对jdk及Tomcat安装目录递归授权root
[root@centos7 ~]# chown -R root.root /usr/java/default /usr/local/tomcat/
#检查环境变量配置情况
[root@centos7 ~]# cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
[root@centos7 ~]# tail -1 /etc/profile
export TOMCAT_HOME=/usr/local/tomcat
检查tomcat是否安装成功
[root@centos7 ~]# /usr/local/tomcat/bin/version.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/default Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/8.5.50 Server built: Dec 7 2019 19:19:46 UTC Server number: 8.5.50.0 OS Name: Linux OS Version: 3.10.0-957.el7.x86_64 Architecture: amd64 JVM Version: 1.8.0_211-b12 JVM Vendor: Oracle Corporation [root@centos7 ~]#
3.tomcat目录介绍
[root@centos7 ~]# cd /usr/local/tomcat/
[root@centos7 tomcat]# tree -L 1
.
├── bin #用以启动,关闭Tomcat或者其他功能的脚本(.bat文件和.sh文件)
├── BUILDING.txt
├── conf # tomcat 配置文件存放目录
├── CONTRIBUTING.md
├── lib # web应用调用的jar包存放路径
├── LICENSE
├── logs #Catalina和其他Web应用程序的日志文件
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp # 存放临时文件
├── webapps
└── work # 存放编译产生的.java 与 .class文件
7 directories, 7 files
webapps目录介绍
[root@centos7 tomcat]# cd webapps/
[root@centos7 webapps]# ll
total 4
drwxr-x---. 15 root root 4096 Feb 9 01:36 docs # tomcat 帮助文档
drwxr-x---. 6 root root 83 Feb 9 01:36 examples # web应用实例
drwxr-x---. 5 root root 87 Feb 9 01:36 host-manager # 主机管理
drwxr-x---. 5 root root 103 Feb 9 01:36 manager # 管理
drwxr-x---. 3 root root 283 Feb 9 01:36 ROOT # 默认站点根目录
Tomcat配置文件目录介绍(conf)
4.Tomcat的启动
启动程序:/usr/local/tomcat/bin/startup.sh
关闭程序:/usr/local/tomcat/bin/shutdown.sh
[root@centos7 conf]# /usr/local/tomcat/bin/startup.sh #程序启动 Using CATALINA_BASE: /usr/local/tomcat #检查环境变量CATALINA_BASE Using CATALINA_HOME: /usr/local/tomcat #检查环境变量CATALINA_HOME Using CATALINA_TMPDIR: /usr/local/tomcat/temp #检查环境变量CATALINA_TMPDIR Using JRE_HOME: /usr/local/jdk #检查环境变量JRE_HOME Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [root@centos7 conf]# netstat -antup | grep java tcp 0 0 :::8080 :::* LISTEN 1352/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1352/java tcp 0 0 :::8009 :::* LISTEN 1352/java
访问网站
网址:192.168.195.166:8080(访问时请注意关闭iptables,这个前面我在系统环境那里已经做了)
查看Tomcat的日志
5.Tomcat管理功能使用
测试功能,生产环境不要用:
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的Web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。
[root@centos7 ~]# vim /usr/local/tomcat/conf/tomcat-users.xml ....... <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #这里的账号和密码不需要在系统中创建的。 </tomcat-users> #在此行前加入上面三行,还需要注意取消注释。 ..... tomcat8.5开始还需要改下面几个文件。 编辑/usr/local/tomcat/webapps/manager/META-INF/context.xml和/usr/local/tomcat/webapps/host-manager/META-INF/context.xml(/usr/local/tomcat是tomcat程序的目录)这两个文件,将其中的这一行注释掉 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
上面的操作的配置文件里内容截图如下
接下来重启tomcat就可以了,重启步骤应该就不用在讲了吧。重启后在浏览器里输入http://192.168.195.166:8080/manager/status进入tomcat的管理界面,然后输入我们在配置文件中配的账号和密码。如下截图是没做配置和配置好的界面。
配置后
6.Tomcat主配置文件Server.xml详解
1.Server.xml组件类别
- 顶级组件:位于整个配置的顶层,如server。
- 容器类组件:可以包含其他组件的组件,如service,engine,host,context
- 连接器组件:连接用户请求至tomcat,如connector。
- 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve,logger。
<server> <service> <connector /> <engine> <host> <context></context> </host> <host> <context></context> </host> </engine> </service> </server>
2.组件介绍
组件名称 |
功能介绍 |
engine |
核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。 |
host |
类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。 |
context |
定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。 |
connector |
接收用户请求,类似于httpd的listen配置监听端口的。 |
service(服务) |
将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。 |
server |
表示一个运行于JVM中的tomcat实例。 |
Valve |
阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。 |
logger |
日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。 |
realm |
可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。 |
UserDatabaseRealm |
使用JNDI自定义的用户认证库。 |
MemoryRealm |
认证信息定义在tomcat-users.xml中。 |
JDBCRealm |
认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。 |
Tomcat内部组成图如下
<?xml version='1.0' encoding='utf-8'?> <!-- <Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素. port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的. shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的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" /> <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 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" ,相对于CATALINA_HOME而言的,也可以写绝对路径。 unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 autoDeploy:在tomcat启动时,是否自动部署。 xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。 xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Context表示一个web应用程序,通常为WAR文件 docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。 path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**** reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序 --> <Context path="" docBase="" debug=""/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
7.tomcat的主页实验
未做主页实验前访问的页面:
接下来我们写个html文件,操作如下
[root@centos7 ~]# cd /usr/local/tomcat/webapps/ROOT/ [root@centos7 ROOT]# echo "<h1>hello,Stranger</h1>" > index.html
接下来我们在访问:
这里我们会有一个疑问,为什么我写了html文件,就把之前的页面文件顶替了,原因如下
[root@centos7 ROOT]# ll total 184 -rw-r-----. 1 root root 27235 Dec 8 03:23 asf-logo-wide.svg -rw-r-----. 1 root root 713 Dec 8 03:21 bg-button.png -rw-r-----. 1 root root 1918 Dec 8 03:21 bg-middle.png -rw-r-----. 1 root root 1401 Dec 8 03:21 bg-nav.png -rw-r-----. 1 root root 3103 Dec 8 03:21 bg-upper.png -rw-r-----. 1 root root 21630 Dec 8 03:21 favicon.ico -rw-r--r-- 1 root root 24 Feb 12 18:32 index.html -rw-r-----. 1 root root 12219 Dec 8 03:23 index.jsp -rw-r-----. 1 root root 7136 Dec 8 03:23 RELEASE-NOTES.txt -rw-r-----. 1 root root 5581 Dec 8 03:23 tomcat.css -rw-r-----. 1 root root 2066 Dec 8 03:21 tomcat.gif -rw-r-----. 1 root root 5103 Dec 8 03:21 tomcat.png -rw-r-----. 1 root root 2376 Dec 8 03:21 tomcat-power.gif -rw-r-----. 1 root root 67795 Dec 8 03:23 tomcat.svg drwxr-x---. 2 root root 21 Feb 12 18:41 WEB-INF [root@centos7 ROOT]# ll WEB-INF/ total 4 -rw-r-----. 1 root root 1227 Dec 8 03:23 web.xml #这里是每个webapp自己的部署方式, [root@centos7 ROOT]# tail /usr/local/tomcat/conf/web.xml #这个就是所有webapp的部署方式。相当于全局配置, <!-- here, so be sure to include any of the default values that you wish --> <!-- to use within your application. --> <welcome-file-list> #从这开始 <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> #到这结束,我们可以看到访问的默认顺序。我们可以实验,把这一段添加到上面的WEB—INF下的web.xml
里,因为这里不建议改全局配置,然后改一下顺序,把index.jsp放上面,在访问一下。
</web-app> [root@centos7 ROOT]#
改了相关配置后,我们在访问,如果没变,需要我们重启一下tomcat,一般不用重启。
从这里我们可以看到刚刚改配置的作用了吧。
8.模拟部署一个应用
# 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"
常见应用首页,
# vi projects/myapp/index.jsp
手动复制项目目录到webapps目录下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/
使用http://YourIP:8080/myapp/访问试试看
[root@centos7 ~]# mkdir projects/myapp/{WEB-INF,classes,lib} -pv [root@centos7 ~]# vim projects/myapp/index.jsp [root@centos7 ~]# cat projects/myapp/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> 后面的内容是服务器端动态生成字符串,最后拼接在一起 <% out.println("hello jsp"); %> </body> </html>[root@centos7 ~]#
1.虚拟主机的配置
在生产工作中经常需要几个web项目部署在一台服务器上,但是不可能为了访问不同的项目还要加上端口吧,这个时候tomcat的虚拟主机就起到作用了,可以通过不同的url达到访问不同的项目。那tomcat的虚拟主机怎么配呢,具体配置如下。
修改tomcat的主配置文件,添加一个虚拟主机,修改如下:
根据上图修改的虚拟主机配置,我们创建虚拟主机根目录。
[root@centos7 ~]# mkdir /data/webapps -pv mkdir: created directory ‘/data/webapps’ [root@centos7 ~]# cp -r /usr/local/tomcat/webapps/myapp/ /data/webapps/ROOT #这里是借用上面的目录。 [root@centos7 ~]# vim /data/webapps/ROOT/index.jsp #为了区分做出修改 [root@centos7 ~]# cat /data/webapps/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> 后面的内容是服务器端动态生成字符串,最后拼接在一起 <% out.println("welcome qingbai1"); %> </body> </html>
然后我们在自己的windows上修改自己的Host文件添加域名。
2.context的配置
appBase 放的是应用目录,放java的war包,放在appBase下,则war包会自动解压;
如果我们的应用放在docBase下,不能放war包,把war包的内容解压后放在docBase定义应用存放的路径下。(其实二者都是定义放网页文件的的路径,只是 一个需要解压一个不需要而已),一般通过通过docBase来定义网站的根目录,讲明白一点就是docBase可以定义目录直接通过ip和端口访问,appBase定义目录的只能通过Ip加端口加定义目录下指定目录进行访问,如果直接定义appBase,然后通过ip加端口访问只会报404错误。