在单台机器上托pipe数十个相当平凡的Java Web应用程序的最佳方式是什么? 这些将是针对不同的客户,因此让他们彼此隔离是很重要的,所以如果一个人倒下,他们不会全部倒下。 我意识到Tomcat可以自己处理多个应用程序,但是让它们全部运行在单个tomcat实例中听起来有点吓人。 每个应用程序的tomcat的实例也似乎愚蠢,因为这些应用程序可能是相当基本的。
有什么想法吗?
如果它们相当简单,那么它们可能不太可能将整个服务器closures,因此可以在一个或几个实例上运行所有服务器。
如果它们不是那么简单,或者如果存在安全问题,那就把它们分开。 如果存在强大的安全性问题,甚至将它们分离到多个虚拟机中。
首先,如果你有简单的低BW应用程序,你可以使用更轻的Servlet容器。 winstone是非常基本的,如果你问我, jetty是大中型应用程序的好select。
所有的应用程序当然可以消耗大量的资源,并打乱整个JVM。 我通常所做的就是把所有的行为良好的人扔在一个JVM中,并给每个JVM分配一个JVM。 这尤其适用于假设他们拥有整个JVM,调用System.exit()等的应用程序。您还可以抛出一些安全约束来防止这种情况发生,但是这会给您很less的IMO,您通常希望应用程序退出错误。
关于具有多个JVM时的性能,要将最小堆大小设置得相当高,限制最大内存使用量,并使用GCalgorithm稍微调整每个应用程序。 JBoss启动脚本在那里有很好的例子。
用于pipe理所有JVM的软件是Upstart 。 它可以让你设置respawn规则和定义崩溃的行动。 如果你没有Upstart,你总是可以使用inittab,尽pipeinittab中的语法错误可能会造成严重的后果:)
我可能会使用OpenVZ虚拟化。 它允许你创build比vmware更轻的独立容器。 我使用这个琐碎的网站,强制FTP服务器等
…对于不同的客户,呃?
如果他们付钱给客户,给他们自己的沙箱,每个客户一个。 如果把它拿下来,只会影响到自己。 似乎对每个人都公平。 不同的JVM可能是最好的方法。
除了其他的答案,你也可以运行多个appservers。 大多数appservers可以安装到一个目录并从那里运行; 在testing服务器时,我经常使用Tomcat来做这件事。
该解决scheme是在一台服务器上运行所有应用程序和为每个应用程序提供完整虚拟化操作系统的中间地带。 如果应用程序在不同的安装环境下运行,则只能在系统范围内的资源(CPU,RAM,磁盘空间,networking带宽)上互相影响。 这可以通过在操作系统或服务器级别应用适当的限制来阻止,就像完全虚拟化所需要的一样。
使用tomcat实际上是一个很好的解决scheme。 你可以创build多个上下文,保持每个客户端分开,这给你一个单一的tomcat实例。 使生活易于维护。 最大的问题,但是,如果你需要添加另一个上下文,你必须重新启动tomcat。 使用乘法上下文也保护客户端,决定做一些愚蠢的事情,比如运行System.exit()
另一个解决scheme是让你更多的控制和安全性,看看像Glassfish( https://glassfish.dev.java.net/ )。 Glassfish让你能够创build域(如tomcats上下文,但有更多的控制)。 你可以dynamic地做到这一点。 这允许你安装glassfish的一个实例,但是每个域运行在它自己的域中(单独的jvms)。 每个域可以完全分开configuration。
你会发现,如果你有更多的客户,像tomcat,docker或其他重量轻的解决scheme将是更多的工作。 Glassfish也提供了最好的graphics界面,如果你愿意的话,你也可以向你的客户展示。
安装glassfish和tomcat一样简单。
如果configuration如此, GlassFish v3可以非常轻量级。 例如,您可以运行Web Profile版本,该版本专门用于仅运行Web应用程序(省略了Java Enterprise Edition的其他部分)。
但是也许你的情况的关键特征是它提供了将服务器embedded到Java应用程序中。 这意味着您可以完全程序化地控制它的实例化方式,数量和configuration。 如果您托pipe大量的Web应用程序,这可能有助于自动化。