Q:
一个 Tomcat 下部署多个项目时启动时间特别长 查看日志可以看出一个项目被 load 了多次
A:
Tomcat 在启动时会加载配置文件 conf/service.xml 每个 Host(↓) 节点下 appBase(webapps) 目录下的所有 war 包 将其解析至路径 name(localhost) 上
<Host name="localhost" appBase="webapps" deployOnStartup="true"
unpackWARs="true" autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_abc_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
此时使用 http(s)://name(:port) 访问 Tomcat 将会被指向该 Host 加载的第一个项目(项目被解压或复制至 ROOT 文件夹)
目录下的其他项目必须通过 name+ 项目名 进行访问
所以往往我们在配置多个 Host 节点 并配置 Context 节点来指定加载的项目目录以同时实现用 域名 或 域名 + 项目名 的方式来访问每个项目 (↓)
<Host name="abc.abc.com" appBase="webapps" unpackWARs="true"
autoDeploy="true">
<Context path="" docBase="abc" debug="0"
reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_abc_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
此时 当 Host 节点中包含 Context 节点时 当 Tomcat 加载完 Host 下 appBase 目录下所有的 war 包或 Web 项目
Tomcat 会再次加载 Context 下以 docBase 为名的 war(abc.war) 包
所以在使用下面的配置时会加载项目 abc 两次
当同时使用两个配置(同时能够使用 IP 及域名进行访问) 项目 abc 三次
解决方案如下:
- 在 Tomcat 下创建属于项目单独的文件夹 (与 Jenkins 冲突)
- 使用域名访问时为项目配置单独的 Host 节点 若项目内请求不使用项目名则不需要配置 Context 节点
- 如需通过 IP 访问项目 则使用默认 Host 节点配置 name 属性为 localhost 并将项目放于 webapps 下
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于