今天在编译 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
资料中还特别提到,这个问题主要影响:
也就是说,当时这个问题很可能和系统版本以及 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
欢迎分享你的看法,也欢迎补充不同的实践经验。