升级到最新的 tomcat/JRE 还是坚持使用 LTS 提供的版本?

升级到最新的 tomcat/JRE 还是坚持使用 LTS 提供的版本?

运行带有 Tomcat 7.0.26 的 Ubuntu 12.04 服务器。我是否应该将 tomcat 安装更新到最新的 7.0.42 版本,还是应该坚持使用提供的版本?如果我坚持使用,那么我是否不会受到 7.0.26 版本中的威胁和漏洞的攻击?有人建议我始终使用最新的次要版本,例如 JRE 7、Tomcat 7 等,这在这里不适用吗?

答案1

切勿使用任务关键型工具,因为它们随 Linux 发行版一起分发。它们通常落后几个版本,并且可能无法按照您期望的方式进行配置。例如,Python 总是将附加包安装在名为 site-packages 的目录中,Debian 和 Ubuntu 发行版除外。

有两种方法可以处理这些任务关键型组件,即对您的业务和特定服务器的目的至关重要的组件。第一种方法或多或少是手动的,但可以使用 bash 脚本自动完成。在这种方法中,您从发行版所称的“上游”下载软件包。这意味着您从 Oracle 的站点获取 JDK,从 Apache 的站点获取 Tomcat,等等。这也意味着您获取的是发起者的软件包格式,可能是 tarball。即使在上游提供 .deb 的情况下,如果它指定了您不想从 Ubuntu 中提取但想要自己控制的依赖项,您可能也无法使用它。对于 Oracle Java,我只需 tar zxvf tarball,将生成的目录 mv 到 /opt,然后将 JAVA_HOME 和 PATH 变量的条目添加到 /etc/bash.bashrc。大多数 Apache 工具(如 Tomcat)也是如此。理想情况下,不要从外部互联网站点 wget(或 curl)获取软件包,而是下载一次并将它们放在内部 http 服务器上以部署到您的服务器。

另一种选择是设置您自己的 Debian 格式的本地存储库,并将您的关键任务包添加到其中。然后将其添加到您的源中,并将首选项配置为高于 LTS 存储库,以便您的包覆盖 LTS。为此,您必须下载 tarball 并构建您自己的 .deb 包,包括定义依赖项,以便您自己的依赖包被引入。这对于大型安装(例如超过 50 台服务器)来说是更好的选择,但除此之外,除了编写良好的 bash 脚本之外,它不会节省太多精力。

现在,当出现安全更新时,获取新的 tarball 的副本,将其放在您的 http 服务器上并更改您的 bash 脚本(或构建新的 .deb),然后通过 ssh 在所有服务器上远程运行 bash 脚本(或使用 SaltStack 或 Ansible 来帮助完成此操作)。

至于始终使用最新的次要版本,我不建议这样做。当新版本发布时,您应该始终阅读发行说明,确定更改是否对您有用或必要,在测试服务器上运行一些内部测试,然后再升级。如果更改很小或对您影响很小,那么落后几个版本是可以的。重要的是您要控制整个过程,做出决定并权衡您的情况的利弊,然后按照您的计划继续升级。有时威胁会要求您立即升级,有时则不会;阅读发行说明以了解何时

别忘了,你运行的不是 Ubuntu 或 Centos。你运行的是 Linux。Ubuntu 和 Centos 可以使某些任务变得更容易,尤其是在设置新服务器时,但在这一切背后,你的系统中 99% 或更多的部分都是标准 Linux,并且具有无限的可塑性。

答案2

请联系负责在 Tomcat 中运行应用程序的任何应用程序供应商/开发人员。虽然 Ubuntu 存储库可能是最好的选择...供应商可能(并且通常确实)有特定的 Java 版本要求。

如果您是 tomcat 实例上所有 web 应用程序的开发人员,那么这个选择的责任就在于您。

答案3

继续使用 Ubuntu 提供的内容,假设它仍提供安全更新。如果它已过期,则迁移到较新的安装。

更新:我无法发表评论,所以我反驳 Dillon 先生的回答。Linux 供应商(如 Ubuntu)提供的软件版本可能较旧,但与软件开发人员发布的最新版本相比,它们经过了充分测试,并且被证明是可靠的。必须构建自己的应用程序堆栈、对其进行测试和部署,这既昂贵又不必要。

答案4

通读答案时,我认为缺少了两件重要且关键的事情。

  1. 没有一家开放 Linux 供应商会对 Tomcat 等软件的兼容性进行广泛的检查,因为它太过小众和多样化。我认为只有 Red Hat 对其整个堆栈的 JBoss 进行了这样的检查,并且只在您使用其企业支持和版本时才保证内容。

  2. 大多数在 Tomcat 上运行的应用程序都是定制的,否则它们已经提供了自己的内部应用程序服务器作为推荐(例如 Jira、Confluence、Jenkins)。对于大多数定制应用程序,唯一的答案就是对其进行测试。

回答这个问题。

通常,坚持使用最新的次要版本是有意义的,但要适度。因此,只有当您发现一个确实会影响您或与您的域中的安全相关的错误时才进行升级(如果它修复了 Applet 中的安全错误,则无需升级)。您也可以直接从 Linux 发行版中执行此操作,对于 Oracle JDK 和 Tomcat,有 PPA 存储库可提供 Ubuntu 更新周期之外的最新版本。

话虽如此,根据您的应用程序的功能,小版本升级也可能会造成问题。尤其是当您进入反射和字节码生成时,您必须小心(这也适用于 Hibernate 等库)。我们在升级 Sun JDK 的小版本时遇到了问题,因为库在处理新字节码时出现了问题。

但这就是测试的目的。因此,只需确保您的开发人员和构建环境使用与服务器上相同的版本,否则您迟早会搞砸事情。

相关内容