前言
SpringBoot内嵌有tomcat,一条命令就可以迅速启动服务。最近上课在老老实实学SSM,SSM项目部署上线,需要打成war包,放到服务器的tomcat上。安装配置tomcat当然最好借助docker啦,下载、安装、卸载都非常方便,哪天tomcat玩坏了,说删就删,配置还能全部保留。
快速入门Docker:
安装运行tomcat
1、拉取最新镜像
docker pull tomcat
2、运行一个tomcat容器用于测试
# 随便运行一个tomcat容器
docker run --name tomcat01 -p 8080:8080 -d tomcat
# 进入容器内部
docker exec -it tomcat01 /bin/bash
为什么要随便运行一个tomcat容器(之后可删除)呢? 因为我们需要知道tomcat容器里面的目录结构是什么样的,以便下次正式运行容器时将容器内的关键目录挂载到的宿主机。那么以后修改配置、拷贝项目war包,无序进入容器内部,直接在宿主机的目录就可以操作,甚至不需要重启容器就可生效!!!
进入容器tomcat01内部,看到的目录结构如上,这里我们只需要关注4个目录:
1、conf:配置相关,进行项目部署时我们需要修改该目录下的配置文件server.xml
2、logs:存储项目产生的日志文件
3、webapps.dist:默认界面等
4、webapps:注意,在启动该容器之后,你访问 ip:8080 会报404,并没有看到Tomcat的Logo兼吉祥物,那只黄色的小公猫。原因是因为,在tomcat9中,虽然默认的8080端口指向了webapps目录下,但是webapps是空的。它实际的资源放在了webapps.dist目录。所以我们只需要将 webapps.dist 的内容全额拷贝到 webapps 里,访问 ip:8080 就可以看到默认页面了。这个下面详细说。
3、复制容器内 /usr/local/tomcat 的所有内容到宿主机
在上面我们也看到了,我们部署项目需要关注访问2中的4个目录。为了方便,我们打算,索性直接将 /usr/local/tomcat挂载到宿主机的 /data/tomcat (可随意)。而挂载是以宿主机为基准的!!!换言之,假如 宿主机的 /data/tomcat 下是空的,那么将 /usr/local/tomcat 挂载到 宿主机的 /data/tomcat,那么容器内部的 /usr/local/tomcat 会全部清空,因为它以宿主机为基准,宿主机对应得目录是怎样得,它就是怎样得。
所以在正式运行tomcat容器进行挂载前,我们需要将测试容器内 /usr/local/tomcat 下的全部内容 拷贝到 /data/tomcat 下。
docker cp tomcat01:/usr/local/tomcat /data/tomcat
4、正式运行tomcat容器
# 停止测试容器
docker stop tomcat01
# 删除测试容器
docker rm tomcat01
# 正式运行我们的tomcat容器
docker run --privileged=true -v /data/tomcat:/usr/local/tomcat -p 8080:8080 -p 8688:8688 -p 80:80 --name tomcat01 -d tomcat
docker run的命令参数,我不多介绍了,看前言中的博客。为什么,我们要进行多个端口映射呢?因为在一个tomcat下部署多个项目时,有两种方案:
1、多个项目用不同的端口来区分
2、多个项目共用80端口,但通过域名来区分
所以为了防止之后我们部署多个项目,我这里除了映射默认的8080端口,还映射了80端口。当然,你可以映射其他一些端口,万一以后需要用到。如果你以后要用到,但容器运行时没有进行相应的端口映射,那该怎么办?直接删了这个容器,重新 通过 docker run 运行一个新容器呗。由于之前我们进行了目录挂载,被删容器的项目资源和配置,是不会丢失的!!!
配置tomcat
1、配置tomcat默认页面
tomcat的默认端口是8080,访问8080端口可访问默认页面。在启动容器之后,访问 ip:8080 会报404,并没有看到Tomcat的Logo兼吉祥物,那只黄色的小公猫。原因是因为,在tomcat9中,虽然默认的8080端口指向了webapps目录下,但是webapps是空的。它实际的资源放在了webapps.dist目录。所以我们只需要将 webapps.dist 的内容全额拷贝到 webapps 里,访问 ip:8080 就可以看到默认页面了。
由于前面启动容器时我们进行了目录挂载,所以我们只需要在宿主机的 /data/tomcat 下操作就行了,而且操作完成后不需要重启容器就可以生效了。刷新 ip:8080,就可以看见默认页面了。
# 此时处于宿主机的 /data/tomcat
cp -r webapps.dist/* webapps/
2、配置Tomcat Web管理界面
(1)管理页面的访问url是:ip:8080/manager/html,但默认情况下管理界面是无法远程访问,你需要关闭相关限制。打开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" />
-->
</Context>
(2)配置管理员用户名和密码。打开 conf/tomcat-users.xml,修改以下配置:
<tomcat-users>
<!--
Comments
-->
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="自定义的用户名" password="自定义的密码" roles="admin-gui,manager-gui"/>
</tomcat-users>
(3)访问管理页面
部署SSM项目
1、项目配置
最简单的项目部署方式,就是利用tomcat的默认端口8080,将 war 包 命名为 ROOT.war
在一个tomcat下部署多个项目时,有两种方案:
1、多个项目用不同的端口来区分
2、多个项目共用80端口,但通过域名来区分
Apache的虚拟主机也是同样的原理。在没有购买域名的情况下,采用不同端口号的方式来区分。如果你已经买有域名了,如果还用不同端口号的方式不同项目,通过 "域名:端口号" 访问不同项目时,域名后面跟个端口号,看着也比较违和。
所以这次我们采用第2种方式,这就是前面在运行容器时,我额外了添加了 80 端口的映射的原因。为什么共用 80端口,而不是其他端口呢?我就不解释了。
打开 conf/server.xml ,在 <Server> 标签之间,添加如下配置:
<Service name="Catalina-项目名">
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8689" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="域名">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
</Realm>
<Host name="域名" appBase="webapps-项目名" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/项目名" prefix="access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
- 根结点中的 Catalina-项目名 是咱们的一个命名,似乎需要Catalina开头,只要不重复即可,在配置文件中可以添加多个如上的配置。
Connector HTTP/1.1
:HTTP链接的配置,这我们的端口就是在这里配置的,我们配置为:80Connector AJP/1.3
:用于给其他服务器做转发的配置,端口配置为:8689;一般用于apache和tomcat之间的通讯。Service
中的端口配置,如果是多个不同的 Service 节点,我们的端口可以配置为一样,只要域名不同即可。Engine-defaultHost
:这里就是配置域名的地方,对于配置同样端口的 Service 可以通过不同的域名解决跳转问题;但是都配置为localhost
或相同域名时请使用不同端口。Engine-Realm
:该节点无须管。Engine-Host-name
:这里我们也配置了 自己已经购买的域名,上面配置了域名则和域名一样即可。Engine-Host-appBase
:这里是重点,我们配置一个文件夹用于我们的项目配置;默认管理界面文件夹为webapps
,这里我们配置为webapps-项目名
Engine-Host-Valve
:该节点中我们主要配置了生成日志的目录,以及其他相关配置
2、项目打成war包,推送到服务器
不同ide的打包方式不同,百度就可以了。推送war包到服务器,可以使用 xftp 或者 winscp。
值得注意的是,在打war包之前,由于服务器的环境和本地环境不一样,要修改相应配置,比如说:数据库的相关配置,数据库驱动包的版本 等等。这些坑我都踩过。。。。
3、将 war 包重命名为 ROOT.war,放到 "webapps-项目名" 下
通过域名访问项目时,ROOT.war 会被自动解压成文件夹 ROOT。如果访问,报500错误,或者 发现 war 包无法自动解压,可通过 linux 命令自行解压试试。我曾经遇到过这个问题。