我有一些别人交给我的盒子,但我甚至无法启动基本的 Apache 服务器。它是通过 yum 安装的(我已卸载并安装了它),当我启动服务(service httpd start)时,它显示“OK”,但没有 pid。状态显示未运行。
在error_log中有以下内容:
[Wed Feb 13 16:16:36 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Wed Feb 13 16:16:36 2013] [notice] Digest: generating secret for digest authentication ...
[Wed Feb 13 16:16:36 2013] [notice] Digest: done
/usr/sbin/httpd: symbol lookup error: /usr/lib64/libaprutil-1.so.0: undefined symbol: apr_os_uuid_get
我猜想它无法启动是因为最后一行。有什么建议吗?
ldd $(which httpd)
linux-vdso.so.1 => (0x00007fff9edff000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4c8815c000)
libpcre.so.0 => /lib64/libpcre.so.0 (0x00007f4c87f30000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4c87d10000)
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0 (0x00007f4c87aec000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4c878b5000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f4c8768c000)
libdb-4.7.so => /lib64/libdb-4.7.so (0x00007f4c87318000)
libapr-1.so.0 => /usr/lib64/libapr-1.so.0 (0x00007f4c870e9000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4c86ecb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4c86b38000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4c86934000)
/lib64/ld-linux-x86-64.so.2 (0x000000369be00000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f4c8672f000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4c864cd000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4c862c5000)
答案1
查看 ldd 信息后,似乎您的 httpd 二进制文件是针对与当前安装的库不同的库进行编译的。我会清除尽可能多的 apache 依赖项,并重新安装它们。不过,在执行此操作之前,我还会检查您是否安装了任何非标准 yum 存储库。某些第三方 yum 存储库因导致一些看起来与此有些相似的严重冲突而闻名。
对于初学者:
yum remove apr-devel apr-util-devel httpd
不幸的是,即使这确实解决了问题,您可能已经深陷系统不兼容的泥潭。看起来,在您之前管理此系统的人要么从源代码编译了内容,要么安装了不兼容的 RPM,要么滥用了第三方存储库。您可能花在重新安装系统上的时间比尝试清理系统的时间还少。
答案2
a)更新所有操作系统提供的软件包:
yum clean all # Clean yum cache so all fresh data will be downloaded
yum --disablerepo='*' --enablerepo=base --enablerepo=updates update
b)检查除了默认 CentOS 存储库提供的软件包之外,是否还安装了任何其他软件包 —base
以及updates
:
yum clean all # Clean yum cache so all fresh data will be downloaded
yum --disablerepo='*' --enablerepo=base --enablerepo=updates list extras
如果有任何看起来相关的,则禁用除这两个之外的所有存储库,并将这些包降级/升级到分发提供的版本。
c) 验证所有包的文件:
rpm -Va
只有修改过的配置文件才会打印为已修改(在打印的每一行的第 3 个字符处查找“5”)。 、 、 、 或 中肯定没有任何内容/lib
。/lib64
如果/usr/lib
修改/usr/lib64
了任何内容,/bin
则/usr/bin
看起来好像有人覆盖了发行版提供的二进制文件 — 要么是毫无头绪的管理员,要么是使用 rootkit 的黑帽黑客。 在这种情况下,您可以重新安装包含这些已修改二进制文件的软件包,但建议完全重新安装,因为很难找出还修改了什么(也许在另一台计算机或虚拟机上安装同一组软件包并进行比较)。
d) 如果以上方法均无效,那么我怀疑这是一个复杂的 rootkit。强烈建议完全重新安装。
答案3
我在 centos 5.8 上遇到了这个问题。在删除软件包之前,请检查您的 /usr/local/lib - 有人在此服务器上安装了较新版本的 apr 并导致了此问题(此服务器上使用 dav 运行 subversion,因此我需要启动 httpd)。
您可以通过以下方式检查:/usr/sbin/httpd -V
输出服务器加载:APR 1.3.3、APR-Util 1.2.7 使用以下工具编译:APR 1.2.7、APR-Util 1.2.7
APR 1.3.3 位于 /usr/local/lib 中。我移动了 /usr/local/lib 库(我知道这很糟糕),然后 httpd 启动了。
答案4
我今天在 centos 6.5 上遇到了类似的问题。错误信息是:
“/usr/sbin/httpd:符号查找错误:/usr/lib64/libapr-1.so.0:未定义符号:dlopen”
我根据 INSTALL 说明从源代码使用 apr-1.5.1 和 apr-util 1.5.3 重新编译了 apache 2.4.10。
我将源代码下载到 /root。按照 INSTALL 中的指示将 apr 和 apr-util 源代码移动到 srclib/。
./configure --with-included-apr
make
make install
这在 /usr/local/apache2/lib 中创建了一个新的 httpd 和 lib
我将 /usr/lib64 中的 lib 文件与 /usr/local/apache2/lib 进行了比较,发现它们的大小不同。
我将新编译的 libapr-1.so.0 复制到 /usr/lib64 中,这解决了这个问题。
service httpd start
[好的}
我也运行 php-fpm,因此也启动了它:
service php-fpm start
[好的]
恢复营业!这可能会帮助其他人解决这个问题。