相当于apachectl的Apache的tomcat优雅

在基本的LAMP堆栈上,至less在我们的RHEL5 / 6服务器上,我们能够通过负载平衡的Web服务器将滚动代码更新应用到我们的文档pipe理系统,而不会通过使用apachectl graceful方式来杀死用户的连接和apachectl graceful-stop 。 我们正在迁移到一个基于Tomcat Web服务器的应用程序,我们希望通过我们的新系统来实现这种function,但是我找不到任何与tomcat6相同的function。 tomcat6有这样的能力吗?

Tomcat没有这样的function。

请记住,Tomcat是一个应用程序服务器,而不是一个Web服务器,它需要在开始时加载东西,也许在closures时closures很好的东西。

简答

如果你有负载均衡的tomcat实例,并且你的负载平衡器支持粘滞会话和实时configuration,那么你可以通过将1个tomcat实例轮换出来,实现你正在讨论的滚动和透明升级(某种程度上)。

长(呃)答案

关于其他的答案tomcat作为应用服务器的正确描述与httpd及其相关的问题实际上有很多方法来得到你想要的,这是一个terminal用户透明重启。

鉴于tomcat通常需要30秒或更长时间,这取决于应用程序是如何从寒冷中部署的,这通常是透明地进行的。

我将解释一下这种方法的另一个好处是,能够在生产之前检查新的应用程序,然后将其应用到您的客户身上,这是令人欣慰的。

所以… apache的平稳重启build议subprocess在完成当前请求后退出,并用新的重新生成的进程/线程replace它们,重新读取新的configuration文件。 因此,长时间运行的连接可以完成下载,而​​新的请求获得新的内容。 在Apache,新旧版本pipe理的平稳重启转换期间,有效的应用程序有两个版本运行。

不幸的是,如果设置了autodeploy = true,那么如果设置了autodeploy = true,对configuration文件或war内容的任何更改都会导致上下文重新部署,而我会猜测Catalina Web容器会在指定的时间内等待所有未完成的线程和请求。 这不是非常透明,你最终将发生可怕的500错误,直到应用程序重新启动:-(

因此,为了实现透明的最终用户体验,您需要在短时间内同时运行两个版本的应用程序,一个用于旧连接,另一个用于新应用程序。 (这些方法有几个注意事项,我将在下面介绍…)

最简单的方法是将前端负载均衡器(如apache,haproxy或Cisco CSM)与2个或更多的tomcat实例(其中负载均衡器支持粘性会话和热负载均衡器configuration部署)。

如tomcat1,tomcat2和平衡器

  1. 将负载均衡器中的服务器场中的tomcat2首选项级别更改为零。 (haproxy肯定,我认为mod_proxy允许你改变实例偏好生活。)
  2. 等到所有连接都打到tomcat1(使用jmx或netstat来监视networking连接)
  3. 在tomcat2上重新部署Web应用程序
  4. 等待tomcat2出来,理智自己testing应用程序!
  5. 将首选项交换到tomcat2为零,并将tomcat1设置为高
  6. 等到所有的连接都在tomcat1上,
  7. 反之亦然。 部署其他节点,并重复等。

请注意,这是更改节点首选级别,而drop节点将允许负载均衡器正常pipe理连接到新Web应用程序的转换。

显然,如果你只有一个服务器,并且只有一个tomcat,你可以想出类似的东西,但这需要一些聪明的命名为你的web应用程序。 我从来没有必要在1个tomcat上部署到生产环境,但是我可以在我的web应用程序的2个版本上安装不同的war名称和docpath,像这样安装在同一个tomcat6上。

 /var/lib/tomcat6/webapps/mywebapp_0_1.war => http://localhost:8080/mywebapp_0_1 /var/lib/tomcat6/webapps/mywebapp_0_2.war => http://localhost:8080/mywebapp_0_2 

并通过使用Apache mod_proxy或haproxy使这两个应用程序之间的连接正常迁移。

即我会有apache httpd和tomcat6一起安装在同一个盒子上,用httpd mod_proxy这样指点;

 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so <Location /balancer-manager> SetHandler balancer-manager </Location> <Proxy balancer://cluster> BalancerMember http://localhost:8080/webapp_0_1 BalancerMember http://localhost:8080/webapp_0_2 </Proxy> <Location /> ProxyPass balancer://cluster/webapp stickysession=JSESSIONID </Location> 

注意 ,如果你不得不升级你的数据库模式,那么除非你想开始做一些疯狂的命名,并将sh * t与你的数据库(如database_0_1)连接起来,那么你将不得不吮吸一些停机时间。

如果你的用户有很长的会话,那么tomcat6支持使用各种后端的会话集群