享学课堂特邀作者:老顾
转载请声明出处!
一、前言
小伙伴们在网上看到的很多文章,都是对tomcat的一些介绍,什么配置啊,怎么启动。其实在生产环境中怎么部署,和网上介绍的有很大区别。这篇文章老顾就带着大家分享一些如何在生产环境下部署。
二、tomcat组件
我们先回顾一下tomcat有哪些组件
我们小伙伴要抓住几个点
对外接收请求是Connector连接器组件,可以支持不同协议,Connector组件中可设置端口,所以我们请求的时候需要输入端口号。可以把Connector当作接待员。
Connector组件接收到请求后,转发给处理**Engine(catalina引擎)**组件去处理。
根据请求的域名,分配到对应的Host主机。
在根据path分配context组件
区分项目有2个核心组件,一个是host,一个是context。根据域名和path分配不同的项目。其实还少了一个就是启动参数的配置,也就是一同的项目启动参数也可以不一样,如端口号啊。
三、部署目录
我们先看一下Tomcat目录结构:
--bin //存放着tomcat启动和关闭脚本--conf //存放着tomcat服务器的各种配置文件--lib //tomcat服务器和所有web应用所属的jar文件--logs //存放着Tomcat的日志文件--temp //存放着Tomcat的运行时产生的临时文件--webapps //把web应用放到此目录即可--work //Tomcat将jsp生成的servlet源文件和字节码文件放到此目录
我们要部署一个web应用,只要把应用的war包放到webapps就可以了。网上一般也是这么讲的。小伙伴们觉得有什么问题吗?
我们看一下,如果我们要部署两个web应用Web-A和Web-B,把他放到webapps中。我们到bin目录下运行startup.sh启动,这样web-A和web-B就可以访问了。
如果现在业务上需要把web-B先暂停,那我们改怎么办?还有就是tomcat启动是会有启动参数设置,如最大线程数,最小线程数等配置。那web-A和web-B怎么配置不一样的启动参数呢?
其实还有一个问题,如果我们要把**tomcat版本升级,怎么办?**把tomcat直接覆盖?那些web应用重新部署?
小伙伴们,应该怎么办呢?
四、目录规划
tomcat软链接
我们先把tomcat应用放到/usr/local目录下
# cd /usr/local# lldrwxr-xr-x. 9 root root 220 5月 8 19:23 apache-tomcat-8.5.40
上面我们是应用了tomcat8.5版本,如果我们需要升级到9.x版本的话,如果我们需要升级到9.x版本的话,那关于tomcat目录的路径就需要重新修改,这就太不方便了,所以我们可以用软链接的方式解决这个问题
# ln -s apache-tomcat-8.5.40 tomcat# lldrwxr-xr-x. 9 root root 220 5月 8 19:23 apache-tomcat-8.5.40lrwxrwxrwx. 1 root root 20 5月 8 16:42 tomcat -> apache-tomcat-8.5.40
这样以后用tomcat应用路径,就直接使用tomcat这个软链接,即使将来tomcat升级只要修改一些软链接就行了,其他就不需要改。
目录分离
我们应该要把tomcat和web应用目录分离出来,即使tomcat升级也跟web应用没有关系。那分离出来,怎么启动呢?
我们要利用启动参数中的CATALINA_HOME和CATALINA_BASE,来指定tomcat程序应用和web应用;通过CATALINA_BASE就可以实现web应用分离出去,我们来看一些tomcat一共有哪些启动参数
启动参数 | 描述说明 |
---|---|
JAVA_OPT | jvm启动参数,设置内存 编码等-Xms100m -Xmx200m -Dfile.encoding=UTF-8 |
JAVA_HOME | 指定jdk目录 |
CATALINA_HOME | tomcat程序根目录 |
CATALINA_BASE | 应用部署目录,默认为 $CATALINA_HOME |
CATALINA_OUT | 应用日志输出目录,默认为$CATALINA_BASE/logs |
CATALINA_TMPDIR | 应用临时目录,默认为$CATALINA_BASE/temp |
我们先在/usr/local目录下新建一个web-apps目录,此目录就放web应用
# mkdir web-apps
# ll
lrwxrwxrwx. 1 root root 20 5月 8 16:42 tomcat -> apache-tomcat-8.5.40
drwxr-xr-x. 2 root root 6 5月 8 20:29 web-apps
在web-apps目录下,新建web-a和web-b目录,这两个目录就是web-A和web-b的web应用目录。
# cd web-apps/
# mkdir web-a
# mkdir web-b
# ll
drwxr-xr-x. 2 root root 6 5月 8 20:33 web-a
drwxr-xr-x. 2 root root 6 5月 8 20:33 web-b
把tomcat程序中的conf目录拷贝到web-a和web-b里面,这样各个web应用都有各自的配置文件。
# cp -r /usr/local/tomcat/conf /usr/local/web-apps/web-a/
# cp -r /usr/local/tomcat/conf /usr/local/web-apps/web-b/
再在web-a和web-b目录下,新建webapps和logs目录,webapps存放web应用,logs存放日志文件。
到此目录分离开了,但还缺少一个启动脚本
五、启动脚本
此启动脚本,老顾引用了网上的一个脚本改造了一下,命名为tomcat.sh
#!/bin/bash
export JAVA_OPTS="-Xms100m -Xmx200m"
export JAVA_HOME="/usr/java/jdk1.8.0_181"
export CATALINA_HOME="/usr/local/tomcat"
export CATALINA_BASE="`pwd`"case $1 instart)$CATALINA_HOME/bin/catalina.sh startecho start success!!;;stop)$CATALINA_HOME/bin/catalina.sh stopecho stop success!!;;restart)$CATALINA_HOME/bin/catalina.sh stopecho stop success!!sleep 2$CATALINA_HOME/bin/catalina.sh startecho start success!!;;version)$CATALINA_HOME/bin/catalina.sh version;;configtest)$CATALINA_HOME/bin/catalina.sh configtest;;
esac
exit 0
脚本比较简单,核心就是启动参数,只要注意CATALINA_BASE="pwd
"的意思是,执行脚本的路径,也就是代表web应用路径是脚本执行的路径;再把tomcat.sh设置一些启动权限 # chmod +x tomcat.sh 。
修改conf下的server.xml
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context path="/" docBase="" reloadable="true" /><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" />
</Host>
修改了红色字体部分,host中的appBase是相对CATALINA_BASE的路径,就是web应用的路径,context中的path是请求url,docBase也是相对路径,相对于appBase的,当然也可以设置绝对路径。在web-a下创建index.html文件
到现在为止的web-a的目录下
# ll
drwx------. 3 root root 254 5月 8 22:05 conf
drwxr-xr-x. 2 root root 197 5月 8 21:27 logs
-rwxr-xr-x. 1 root root 598 5月 8 21:21 tomcat.sh
drwxr-xr-x. 2 root root 24 5月 8 21:25 webapps
# ll webapps/
-rw-r--r--. 1 root root 12 5月 8 21:25 index.html
启动tomcat.sh
# ./tomcat.sh start
访问 http://192.168.31.150:8080/ 就ok了,直接返回了index.html里面的内容。
需要说明的是,在web-a执行tomcat.sh,里面的启动参数**CATALINA_BASE是web应用路径,那tomcat.sh脚本中的$CATALINA_HOME/bin/catalina.sh 这个脚本执行所采用的conf配置文件是web-a目录下的,**跟tomcat程序的conf没有任务关系,也跟web-b目录下的conf也没有任何关系,这样就达到了应用之间的配置分离。
补充一下,**在配置context和host时,很多公司不会在server.xml配置,而是通过conf/Catalina目录下,新建host和context,**这个知识点,网上很多,小伙伴们可自行查看,因为我们已经单应用分离出来了,那样的配置好处不大。
六、总结
上面老顾介绍了tomcat在生产环境的部署要点,其实还缺少一个环节,就是我们war包或jar包是按照什么流程以及方式上传到生产环境的?这个留个悬念,下次老顾会介绍。
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
资料领取方式:戳这里免费领取
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
学会了。
资料领取方式:戳这里免费领取
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
[外链图片转存中…(img-YV84jmMb-1623614617860)]
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。