apache启动时如何修复“未定义符号:BrotliEncoderTakeOutput”

时间:2019-08-22 06:56:35

标签: apache brotli

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

错误:

  

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

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我不知道这是否是原因 ...在我的情况下,我们试图将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 / dir进行安装的,因此它会尽可能少地覆盖安装……不是确定是否需要它,但这就是我所做的。

我首先弄清楚了B),但是在A)完全起作用之后,它并没有选择Brotli库。

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

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