在生产环境中实现最佳性能的 APR

Posted

技术标签:

【中文标题】在生产环境中实现最佳性能的 APR【英文标题】:APR for optimal performance in production environments 【发布时间】:2019-10-26 03:00:56 【问题描述】:

我正在一个 docker 容器中安装一个 java 应用程序。它运行良好,但我在日志中不断出现此错误:

INFO 1 --- [ost-startStop-1] ocatalina.core.AprLifecycleListener : 在 java.library.path: [/usr /java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/ lib:/usr/lib]

所以,我尝试按照this 和this 安装此APR 包,并通过在我的dockerfile 中添加此行来安装tomcat native:

运行 apt-get install -y libtcnative-1

但是,当添加此行时,我在日志中收到以下消息:

错误 1 ​​--- [ost-startStop-1] ocatalina.core.AprLifecycleListener :安装了基于 APR 的 Apache Tomcat Native 库的不兼容版本 [1.1.33],而 Tomcat 需要版本 [1.2.14]

我尝试安装:

apt-get install -y openjdk-8-jdk libapr1-dev

apt-get install -y openjdk-8-jdk libtcnative-1 libapr1-dev

但这些都不起作用..我不断收到相同的消息。

我也尝试按照第一个答案 here 从源安装,但这也不起作用。

这是我的 dockerfile 的其余部分:

FROM ubuntu:16.04

RUN apt-get update \
 && apt-get install -y software-properties-common python-software-properties \
 && add-apt-repository ppa:mozillateam/ppa \
 && apt-get update \
 && apt-get install -y firefox firefox-esr

RUN apt-get install -y libtcnative-1 openjdk-8-jdk 

感谢任何帮助。谢谢!

【问题讨论】:

"I keep gettig this error" 但是日志记录是INFO,所以它不是错误。这是一条信息性日志消息。 从消息中,我的印象是我应该使用这个库进行生产,我也想在生产中使用这个 dockerfile 当我在 docker 之外本地运行它时,我没有收到此消息。另外,我使用 gradlee 在容器外构建 jar。我想知道这是否与它有关.. 很抱歉,该 dockerfile 的哪一部分安装了 Tomcat? 假设您没有安装 Tomcat,但它嵌入在您的代码中,那么您显然需要一个与代码中嵌入的 Tomcat 版本相匹配的 APR 文件,因此获取它应该是您的一部分Gradle 构建,APR 文件应与 jar 文件一起交付。 【参考方案1】:

如果有人仍然感兴趣,这就是我所做的:

    从 Apache 下载最新的 apr 和 tcnative 并将存档解压缩到 Dockerfile 所在的目录中 执行多阶段构建。第一阶段构建库:
    FROM adoptopenjdk/openjdk11:jdk-11.0.1.13 AS build
    ADD apr-1.7.0 $HOME/apr-1.7.0
    ADD tcnative $HOME/tcnative
    ARG DEBIAN_FRONTEND=noninteractive    
    RUN apt-get update -y && \
        apt-get -y upgrade && \
        apt-get install -y build-essential libssl-dev
    WORKDIR $HOME/apr-1.7.0
    RUN ./configure && make && make install

    WORKDIR $HOME/tcnative
    RUN ./configure --with-apr=/usr/local/apr/bin/apr-1-config  --with-java-home=$JAVA_HOME  --with-ssl=$HOME/OPENSSL --prefix=/usr/local/apr
    RUN make && make install
    第二阶段构建生产服务器:
    FROM adoptopenjdk/openjdk11:jre-11.0.10_9
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update -y && \
        apt-get -y upgrade && \
        apt-get install -y --no-install-recommends libssl-dev x11-apps && \
        apt-get clean && \
        apt-get autoremove -y --purge && \
            rm -rf /var/lib/apt/lists/*    
    COPY --from=build /usr/local/apr /usr/local/apr

    当你调用 java 来运行你的 jar 时,设置你的库路径:

    ENTRYPOINT ["java","-Djava.library.path=/usr/local/apr/lib","-jar","app.jar"]

应用现在启动并报告正确的库:

org.apache.catalina.core.AprLifecycleListener - Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].

【讨论】:

以上是关于在生产环境中实现最佳性能的 APR的主要内容,如果未能解决你的问题,请参考以下文章

生产环境中的 Elasticsearch 配置和最佳实践

如何在angularjs中实现导航栏

maven 本地环境开发环境 测试环境生产环境打包

Windows下MySQL生产环境配置

mysql读写分离

将 ReactJS 构建/编译/部署到生产环境的最佳方法 [关闭]