【问题标题】:Tomcat with compression enabled causes error on OS X High Sierra启用压缩的 Tomcat 在 OS X High Sierra 上导致错误
【发布时间】:2018-03-14 08:20:18
【问题描述】:

我们在 OS X 上使用 Tomcat (v7) 已经有一段时间了,从未遇到任何问题。但是,将操作系统更新到 High Sierra 后,在 server.xml 中启用压缩后,Web 应用程序将不再工作。

Chrome 经常显示 ERR_CONTENT_DECODEDING_FAILED(显然没有任何内容显示)。关闭压缩后,一切正常。我认为问题的根源是 Apple 在 High Sierra 中升级 zlib。 Sierra 上一切正常。 Tomcat 日志文件看起来完美无缺——没有提到那里发生任何错误。

有没有人遇到同样的问题并设法解决它或知道一个可行的解决方法不禁用压缩

此外,如果有人能确认新版本的 Tomcat 在 High Sierra 上没有遇到此问题,也会很有帮助。

感谢您的帮助。

【问题讨论】:

  • 我找不到解决办法。必须关闭 server.xml 中的压缩。请发布您找到的任何解决方案
  • 我还有一个问题是 gzip 停止在终端上工作。用 homebrew 安装的 gzip v1.8 (/usr/local/Cellar/gzip/1.8) 替换 /sw/bin/gzip 解决了这个问题。对我来说——Tomcat的这个压缩问题只限于js和css文件。 Html 仍在渲染中。

标签: java macos tomcat compression zlib


【解决方案1】:

这是 Java SDK setLevel() 方法实现方式中的一个错误。据悉,设置级别产生的压缩数据被SDK丢弃。这将导致损坏的压缩数据。该bug的修复可以在xuemingshen写的here找到。

【讨论】:

  • 如果错误在 JDK 中,为什么它在以前的 OS X 版本中有效?我仍然认为这是一个与 zlib 相关的错误,因为 Apple 在 High Sierra 中进行了重大升级......无论如何:哪些版本的 JDK 会受到您所说的错误的影响?
  • 据我所知,它会影响 JDK 的所有版本,直到修复实施。 zlib 在其规范中改变了它的行为,暴露了 JDK 中的错误。 JDK 没有正确处理来自 zlib 函数的返回代码,丢弃了该函数可以返回的数据,而现在在这个应用程序中确实返回了。这不是 zlib 中的错误。
  • 谢谢,我现在明白了,你写的很有意义。我真的希望尽快修复 JDK 错误。在那之前,我想我必须在我的 Tomcat 服务器上关闭压缩。
  • 这似乎是底层 JDK 错误:bugs.openjdk.java.net/browse/JDK-8184306
  • 如果你转到oracle.com/technetwork/java/javase/8all-relnotes-2226344.html 并在页面上找到“zlib”,你会发现即使是最新的 Oracle JDK 8 也没有解决这个问题(截至 1.8u152) .我会说请继续关注该文档以寻找修复它的版本。
【解决方案2】:

在找到实际解决方案之前的解决方法:在您的 tomcat 项目的 server.xml 配置中关闭压缩。

【讨论】:

  • 谢谢,但如果您仔细阅读我的问题,就会发现我正在寻找修复/解决方法不禁用压缩
【解决方案3】:

Workarround/Hack for Windows:不幸的是,我不熟悉 OS X,但我在 Windows 上遇到了同样的问题,并且已经能够找到一些肮脏的解决方案。 8u162-ea 中的 deflate.c 错误已修复,请参阅 https://bugs.openjdk.java.net/browse/JDK-8189789

很遗憾,8u162-ea 可能未包含所有修复程序,或者可能不足以用于生产环境。

要在8u152 下修复它,请从http://jdk.java.net/8/ 下载并安装最新更新

转到安装文件夹(例如C:\Java\jdk8-162-ea\jre\bin\)并复制包含修复程序的zip.dll(请参阅JDK 9 deflate.c fix)并将其粘贴到jdk 8u152下的同一位置。

希望你能在 OS X 下找到类似的东西。

【讨论】:

    【解决方案4】:

    仅供参考,OS X 用户,我尝试从 http://jdk.java.net/8/ 安装 JDK 8u162-ea,但没有解决问题。我认为原因是,与 Windows JDK 不同,OS X JDK 不捆绑 zlib,而是使用 OS X 中包含的 zlib (/usr/lib/libz.1.dylib)。这可以通过查看 java 可执行文件所依赖的共享库来看出:

    $ otool -L /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
    /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java:
        /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
        /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55179.0.2)
        /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 45.0.0)
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.1.0)
        /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.11.0)
    

    所以我认为我们需要 Apple 以 High Sierra 的更新。

    【讨论】:

    • 不,JDK需要修复。如果错误在 JDK 中得到修复,那么它将与 High Sierra 中的 zlib 一起使用。
    • 也许吧。但是,bugs.openjdk.java.net/browse/JDK-8189789 说 JDK 错误是在 JDK 8u151 中引入的,但我遇到了 JDK 8u144 的问题。我在升级到 High Sierra 后开始体验它,而不是在升级我的 JDK 之后。
    • 据我了解,JDK中的bug从一开始就存在。正是新版本的 zlib 引起了 bug。
    【解决方案5】:

    我们针对本地开发人员的解决方法:我们使用 spring boot 并有一个 EmbeddedServletContainerCustomizer。更新到 High Sierra 后,同样的问题。该问题仅存在于本地开发中,因此不存在于生产中。如上所述,我们在 MainConfiguration 中关闭了压缩,如下所示:

        @Bean
        public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainerFactory servletContainer) {
                ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
                        new TomcatConnectorCustomizer() {
                            @Override
                            public void customize(Connector connector) {
                                AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
                                httpProtocol.setCompression("off");
                                httpProtocol.setCompressionMinSize(256);
                                String mimeTypes = httpProtocol.getCompressableMimeTypes();
                                mimeTypes += "," + MediaType.APPLICATION_JSON_VALUE;
                                mimeTypes += "," + "text/css";
                                mimeTypes += "," + "application/javascript";
                                httpProtocol.setCompressableMimeTypes(mimeTypes);
                            }
                        });
            };
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2018-12-02
      • 2018-06-02
      相关资源
      最近更新 更多