我已经编译了mod_brotli.so
,但是当我重新启动apache时,它无法加载模块。
错误:
httpd:/usr/local/apache2/etc/httpd.conf的第155行的语法错误:无法将modules / mod_brotli.so加载到服务器中:/usr/local/apache2/modules/mod_brotli.so:未定义的符号: BrotliEncoderTakeOutput
答案 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
在做什么,或者为什么应该有不同的方式来编译模块,但是,嘿。
我希望这至少会有所帮助。