数字营销 · Web开发 · 基础设施

CentOS升级zlib库导致yum运行错误

记录一次编译升级 zlib 后导致 CentOS yum 出现 Segmentation fault,以及排查系统库兼容性问题的过程。

今天在编译 LNMP 环境时,遇到了一个问题。

系统自带的 zlib 版本有点低,而 Nginx 在编译安装的时候又需要指定 zlib 库的位置,所以我干脆考虑直接把系统自带的 zlib 换掉。

这里首先遇到了一个选择:

zlib 到底应该使用 yum 升级,还是卸载系统原来的版本之后,再自己编译安装?

如果使用 yum 升级,那么在安装 Nginx 的时候,又应该如何指定 zlib 的位置?

由于这个问题一直没有很好地解决,最终我选择了自己编译安装 zlib。

编译安装 zlib

首先从官方网站下载最新版本的 zlib,然后进行编译安装。

编译的时候,我指定了安装目录:

/usr/local/zlib

库文件路径则设置到了:

/lib64

zlib 编译完成之后,其它方面看起来一切正常。

但是,当我再次运行 yum 的时候,却发现 yum 已经无法正常运行了。

每次执行 yum,都提示:Segmentation fault

这就比较奇怪了。zlib 明明已经安装完成,其他程序看起来也没有什么问题,为什么 yum 反而不能用了?

原来是 zlib 版本兼容问题

后来在网上查了一些资料,最终在 CentOS 的网站上找到了相关信息。

当时找到的描述大致是:

Some apps require the latest version of zlib (1.2.5)
After installation from source yum segfaults.

后面的解决办法是:

rm -rf /usr/lib/libz.*

然后重新安装:

zlib-1.2.3

资料中还特别提到,这个问题主要影响:

CentOS 4.x RHEL 4.x 版本。

也就是说,当时这个问题很可能和系统版本以及 zlib 版本之间的兼容性有关。

我按照这个方法,将 zlib 换回 1.2.3。

再次运行 yum 已经可以正常运行了。

这样,yum 的问题算是解决了。

这次经历还是比较有意思的。

我原本只是想把 zlib 升级到比较新的版本,没有想到升级完成之后,反而把系统原来的 yum 搞坏了。看来,在服务器上升级基础库的时候,不能只考虑“版本越新越好”,还需要考虑系统本身以及其他软件之间的兼容关系。

Nginx 编译时如何指定 zlib?

到这里,yum 的问题解决了,但是还剩下一个问题。

如果系统中本身已经存在 zlib,或者直接通过 yum 安装 zlib,那么在编译 Nginx 的时候,到底应该怎么指定 zlib 呢?

当时 zlib 的默认安装路径是:

/usr/local

那么 Nginx 编译的时候,是不是直接指定:

--with-zlib=/usr/local

就可以了?

我自己进行了一番实验,结果发现:

--with-zlib=/usr/local

这种方式并不能正常完成 Nginx 的编译。所以,这个问题还需要继续研究。

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。