apache 启动时如何修复 "undefined symbol: BrotliEncoderTakeOutput"
How to fix "undefined symbol: BrotliEncoderTakeOutput" when apache start
我已经编译了mod_brotli.so
,但是当我重新启动apache时,它无法加载模块。
错误:
httpd: Syntax error on line 155 of /usr/local/apache2/etc/httpd.conf: Cannot load modules/mod_brotli.so into server: /usr/local/apache2/modules/mod_brotli.so: undefined symbol: BrotliEncoderTakeOutput
我遇到了同样的问题。我不知道这是否是 原因...在我的例子中,我们正在尝试将 mod_brotli 添加到 Apache 2.4.34,来自 Red Hat 软件集合(为什么他们不使用 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 行。
如果我找到答案会再post...
====
编辑:
我让它工作了(好吧,有与 haproxy 和 h2c(未加密的 http2)相关的问题,但那是另一回事)
就我而言,这两个问题是
A) 我以错误的方式编译了 brotli(基于一些博客 posts),根据 google github 自述文件进行编译
B) 我用 apxs
命令编译模块,但事实证明它只适用于 third party 模块。 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
有什么不同,或者为什么应该有不同的方法来编译模块,但是嘿。
我希望这至少能有所帮助。
我已经编译了mod_brotli.so
,但是当我重新启动apache时,它无法加载模块。
错误:
httpd: Syntax error on line 155 of /usr/local/apache2/etc/httpd.conf: Cannot load modules/mod_brotli.so into server: /usr/local/apache2/modules/mod_brotli.so: undefined symbol: BrotliEncoderTakeOutput
我遇到了同样的问题。我不知道这是否是 原因...在我的例子中,我们正在尝试将 mod_brotli 添加到 Apache 2.4.34,来自 Red Hat 软件集合(为什么他们不使用 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 行。
如果我找到答案会再post...
====
编辑:
我让它工作了(好吧,有与 haproxy 和 h2c(未加密的 http2)相关的问题,但那是另一回事)
就我而言,这两个问题是
A) 我以错误的方式编译了 brotli(基于一些博客 posts),根据 google github 自述文件进行编译
B) 我用 apxs
命令编译模块,但事实证明它只适用于 third party 模块。 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
有什么不同,或者为什么应该有不同的方法来编译模块,但是嘿。
我希望这至少能有所帮助。