【问题标题】:How to fix "undefined symbol: BrotliEncoderTakeOutput" when apache startapache启动时如何修复“未定义符号:BrotliEncoderTakeOutput”
【发布时间】:2019-12-27 10:33:08
【问题描述】:

我已经编译了mod_brotli.so,但是当我重新启动apache时,它无法加载模块。

错误:

httpd:/usr/local/apache2/etc/httpd.conf 第 155 行的语法错误:无法将模块/mod_brotli.so 加载到服务器中:/usr/local/apache2/modules/mod_brotli.so:未定义符号: BrotliEncoderTakeOutput

【问题讨论】:

  • 你能编辑并说出你是如何构建模块的,如果你使用系统 brotli 还是自己构建的等等?
  • 更新了我的答案,希望对您有所帮助

标签: apache brotli


【解决方案1】:

我也有同样的问题。我不知道这是否是原因 ...在我的情况下,我们正在尝试从 Red Hat 软件集合中将 mod_brotli 添加到 Apache 2.4.34(为什么他们不使用Brotli 并包含 Brotli 包作为依赖项,我不知道)。

我不是 C 开发人员,来自管理方面,我不明白为什么它不起作用。 一开始我以为是ldconfig的问题,于是在config目录下加了一个新文件,但是还是不行……

# apachectl -M
httpd: Syntax error on line 129 of /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf: Cannot load /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_brotli.so into server: /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_brotli.so: undefined symbol: BrotliEncoderTakeOutput

在这里你可以看到 ld 知道它,并且 lib 有符号...

# ldconfig -p | grep brotli
libbrotlienc.so.1 (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlienc.so.1
libbrotlienc.so (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlienc.so
libbrotlidec.so.1 (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlidec.so.1
libbrotlidec.so (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlidec.so
libbrotlicommon.so.1 (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlicommon.so.1
libbrotlicommon.so (libc6,x86-64) => /usr/local/lib64/brotli/libbrotlicommon.so

# nm /usr/local/lib64/brotli/libbrotlienc.so | grep BrotliEncoderTakeOutput
0000000000090970 T BrotliEncoderTakeOutput

同时,您可以在 mod_brotli 中看到未定义的符号:

# nm /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_brotli.so | grep BrotliEncoderTakeOutput
U BrotliEncoderTakeOutput

编译 Apache 模块是用

apxs -i -c -I /usr/local/include/brotli/ mod_brotli.c

Brotli 本身是从 github 的最新 tarball 编译而来的...

Apache 运行良好,但 brotli 行已被注释掉。

如果我找到答案会再次发布...

====

编辑:

我让它工作了(嗯,有与 haproxy 和 h2c(未加密的 http2)相关的问题,但这是另一回事)

就我而言,这两个问题是

A)我以一种糟糕的方式编译了 brotli(基于一些博客文章),按照 google github 自述文件进行编译

B) 我正在使用apxs 命令编译模块,但事实证明这仅适用于第三方 模块。 Apache 内置模块的正确方法是:

./configure --prefix=/opt/rh/httpd24/root/etc/httpd --enable-brotli --with-brotli=/usr/local

然后make install(前缀当然是 RH SCL 版本)(我实际上确实从 modules/filters/ 目录进行安装,所以它会尽可能少地安装作为覆盖...不确定是否它是必需的,但我就是这样做的)。

我首先想到了 B),但它没有使用 Brotli 库,在 A) 之后它完全工作了。

我不知道apxs 有什么不同,或者为什么应该有不同的方式来编译模块,但是嘿。

我希望这至少会有所帮助。

【讨论】:

猜你喜欢
  • 2017-12-06
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2019-12-19
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多