Tomcat 上的战争部署需要很长时间

Posted

技术标签:

【中文标题】Tomcat 上的战争部署需要很长时间【英文标题】:War deployment on Tomcat takes ages 【发布时间】:2010-12-19 21:57:05 【问题描述】:

我有一个 Grails 应用程序,构建为一个 war 文件 (~30mb)。当我尝试通过应用程序管理器在 Tomcat 6 上部署 war 文件时,部署需要 10 分钟以上,或者无限期挂起。当它挂起时,我可以重新启动 Tomcat 并且通常会部署该应用程序,但有时我必须重复该过程。我还注意到,在部署过程中,Java 进程会最大限度地使用 CPU,而 RAM 大约为 10-15%。

我对 Java 还很陌生,所以我不知道这是否正常,但我无法想象会是怎样。我能做些什么来让这个运行更顺畅/更快吗?有没有比Tomcat的应用管理器更好的部署方式?

【问题讨论】:

查看tomcat日志(tomcat/logs/) 【参考方案1】:

我将 WAR 上传到我的主目录,cd 到 /usr/local/tomcat,然后运行以下命令:

bin/shutdown.sh
rm webapps/ROOT.war
rm -rf webapps/ROOT
cp ~/ROOT.war webapps
bin/startup.sh

【讨论】:

这些似乎是要走的路。直接从 webapps 文件夹部署只需要一两分钟。回复:热部署,我发现热部署后系统有点卡顿,所以关闭、部署、启动策略似乎是最好的。谢谢! 关于热部署的另一个注意事项,由于 CPU 使用率为 100%,实时应用程序无论如何都完全无法使用,因此在部署期间保持 Tomcat 在线几乎没有什么好处。【参考方案2】:

一定要检查 Tomcat 日志中是否有任何错误/警告。

您可能在ServletContextListeners 之一中有一些昂贵/敏感的代码逻辑。它们通常在启动期间初始化。如果是这样,那么我会针对任何性能问题/泄漏对其进行调试/分析。

【讨论】:

【参考方案3】:

如前所述,我会将战争复制到 webapps 文件夹并让 tomcat 进行部署,这也可以更快地节省您的时间。

Tomcat 和 Jetty 都将支持热部署。他们只是监视部署目录的更改,因此您只需将 .war 文件复制到该目录中,服务器就会取消部署/重新部署。

如果使用远程服务器,请检查延迟不是通过网络将战争上传到远程服务器所需的时间。

【讨论】:

【参考方案4】:

不要使用应用程序管理器。我的方法是将它上传到 webapps 目录之外的某个地方,然后将其复制到 webapps 目录。部署时间大大减少。

【讨论】:

如果应用服务器在所有文件(相关类本身)被复制之前开始加载你的webapp,它不会发生冲突吗? 我复制的是war文件,不是解压文件。【参考方案5】:

您并不总是有足够的访问权限来手动将文件放入webapps 文件夹——您应该使用 Tomcat 应用程序管理器进行.war 文件部署,并且需要使其工作。

对我来说,将.war 文件上传到服务器的过程无法完成是很常见的;它卡在中间的某个地方,并且无论我重试多少次,文件都只是部分上传到服务器。在这种情况下,我发现尝试其他浏览器是值得的。例如,我发现自己一直在使用谷歌浏览器,但一旦我切换到新启动的 Firefox 浏览器,事情就解决了。

【讨论】:

部署帐户的超级用户权限可以为您创造奇迹。直接复制到文件系统比使用 Tomcat 管理界面快得多【参考方案6】:

这可能与BUG of JDK有关

我阅读了this article, Tomcat7 starts too late on Ubuntu 14.04 x64 并解决了我的问题。

尝试通过替换

来解决它
securerandom.source=file:/dev/urandom  

securerandom.source=file:/dev/./urandom 

$JAVA_PATH/jre/lib/security/java.security

【讨论】:

以上是关于Tomcat 上的战争部署需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jenkins 将战争文件部署到 Tomcat 的推荐方法?

向tomcat部署战争

在没有 Tomcat 管理器的情况下从 jenkins 自动部署战争文件

如何自动将战争从 Nexus 部署到 Tomcat?

用magnolia cms在tomcat中部署新战

如何使用 maven 中的 tomcat 插件部署多个战争?