- Arch Linux 2011.08.19 (Linux 3.4.2 i686)
- Apache 2.2.22 → 2.2.22(重新编译和重新安装)
- OpenSSL 1.0.1.c-1
这些细节可能无关紧要,但是:每次有可用升级时,我都会使用 yaourt 和 custompkg 从源代码构建 Apache,这样我就可以将 suexec docroot 更改为我想要的内容,而无需自己手动编辑 PKGBUILD。
在过去,这种方法完美无缺。然而,现在看来,无论出于何种原因,Apache 都无法编译。我刚刚进行了完整的系统升级,因此可能与此有关。
以下是修改后的 PKGBUILD 中的配置行:
../configure --enable-layout=Arch \
--enable-modules=all \
--enable-mods-shared=all \
--enable-so \
--enable-suexec \
--with-suexec-caller=http \
--with-suexec-docroot=/srv/www \
--with-suexec-logfile=/var/log/httpd/suexec.log \
--with-suexec-bin=/usr/sbin/suexec \
--with-suexec-uidmin=99 --with-suexec-gidmin=99 \
--enable-ldap --enable-authnz-ldap \
--enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \
--enable-ssl --with-ssl \
--enable-deflate --enable-cgid \
--enable-proxy --enable-proxy-connect \
--enable-proxy-http --enable-proxy-ftp \
--enable-dbd \
--with-apr=/usr/bin/apr-1-config \
--with-apr-util=/usr/bin/apu-1-config \
--with-pcre=/usr \
--with-mpm=${mpm}
当我尝试构建时,它似乎运行良好,直到它到达 OpenSSL 的东西:
mkdir modules/ssl
checking whether to enable mod_ssl... checking dependencies
checking for SSL/TLS toolkit base... none
checking for OpenSSL version... checking openssl/opensslv.h usability... yes
checking openssl/opensslv.h presence... yes
checking for openssl/opensslv.h... yes
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... yes
checking for openssl/ssl.h... yes
OK
forcing SSL_LIBS to "-lssl -lcrypto "
adding "-lssl" to LIBS
adding "-lcrypto" to LIBS
checking openssl/engine.h usability... yes
checking openssl/engine.h presence... yes
checking for openssl/engine.h... yes
checking for SSLeay_version... no
checking for SSL_CTX_new... no
checking for ENGINE_init... no
checking for ENGINE_load_builtin_engines... no
checking for SSL_set_cert_store... no
configure: error: ... Error, SSL/TLS libraries were missing or unusable
==> ERROR: A failure occurred in build().
Aborting...
==> ERROR: Makepkg was unable to build apache.
==> Restart building apache ? [y/N]
==> -------------------------------
==>
谷歌搜索后,许多人报告解决方案是export LDFLAGS=-ldl
,但这对我没有任何影响,无论是在构建脚本中还是在我的 bash 配置文件中设置。
答案1
我在将 openssl 从 0.9.8zb 升级到 1.0.1i 时遇到了同样的问题。
$/tmp/src/openssl-1.0.1i/ ./config --prefix=/usr/local/openssl -fPIC
$/tmp/src/openssl-1.0.1i/ make test
$/tmp/src/openssl-1.0.1i/ sudo make install
$/tmp/src/httpd-2.2.27/ ./config --enable-so --enable-ssl=shared --with-ssl=/usr/local/openssl
...
$configure: error: ... Error, SSL/TLS libraries were missing or unusable
设置环境的解决方案都无法修复我收到的错误消息。
我的解决方案是:
$/tmp/src/openssl-1.0.1i/ ./config --prefix=/usr/local/openssl-1.0.1 -shared -fPIC
$/tmp/src/openssl-1.0.1i/ make clean
$/tmp/src/openssl-1.0.1i/ make
$/tmp/src/openssl-1.0.1i/ make test
$/tmp/src/openssl-1.0.1i/ sudo make install
$sudo /sbin/ldconfig -v /usr/local/openssl-1.0.1/lib
$/tmp/src/httpd-2.2.27/ make clean && make distclean
$/tmp/src/httpd-2.2.27/ ./configure --enable-so --enable-ssl=shared --with-ssl=/usr/local/openssl-1.0.1
$/tmp/src/httpd-2.2.27/ make
$/tmp/src/httpd-2.2.27/ sudo make install
该问题已通过 openssl 配置中的 -shared 值修复。现在我面临另一个问题,即 sslv2 方法无法访问。但这与这个问题无关,我还没有答案。
我将继续搜索有关 sslv2 问题的答案,并在解决后将其发布到相关的 stackexchange 主题。
答案2
其他谷歌搜索可能会引导您设置一些环境变量,如下所示:
$ env LDFLAGS=-ldl
或者
$ export LIBS=-ldl
第一个对我来说失败了,并给了我同样的错误,但第二个有效。
如果第一个不适合您,因为您需要将命令作为单行运行。因为它需要 LDFLAGS 变量运行时并且不会保存。
例如: env LDFLAGS="-ldl" \ ./configure --prefix=/some/path ...
答案3
看起来 httpd 配置包含错误版本的 OpenSSL。
checking for openssl/engine.h... yes
checking for SSLeay_version... no
checking for SSL_CTX_new... no
如果您安装了多个 OpenSSL,则可能会发生这种情况。尝试设置该--with-ssl
选项以匹配最新 OpenSSL 安装的前缀。
--enable-ssl \
--with-ssl=/usr/local \
答案4
发生这种情况是因为 openssl 的 pkg-config 文件不再指定对 libdl 的依赖项。查看较新版本的 openssl.pc,您会发现不再包含 -ldl。
这就是设置LIBS=-ldl
起作用的原因(以及可能影响共享对象使用的其他方法)。
根据 CHANGES 日志,从 0.9.6h 到 0.9.7 进行了修改,这样 openssl 并不总是需要动态共享对象加载。我不相信 openssl.pc 文件的更改是同时发生的。我没查到这个改动是什么时候发生的。
所以我认为这在技术上是 Apache 使用 pkg-config 来确定构建所需的库的一个错误。我刚刚在尝试构建 Apache 2.2.31 时遇到了同样的问题,所以这个问题已经存在很长一段时间了。