在生产环境中实现最佳性能的 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的主要内容,如果未能解决你的问题,请参考以下文章