目的
生产环境需要使用 httpd 最新版本 2.4.39,由于通过 yum install 安装的 httpd 版本不够新,所以自己编译打包。
环境
Centos7
步骤
下载安装包
mkdir /opt/source
cd /opt/source
wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.39.tar.bz2
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.bz2
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2
apr 和 apr-util 是 httpd 所需要的,之所以不用 yum install 安装,是因为用 yum install 安装 apr-1.4.8 和 apr-util-1.5.2 后,在打包 httpd 时出现如下错误:
File not found: /root/rpmbuild/BUILDROOT/httpd-2.4.39.x86_64/usr/lib64/httpd/modules/mod_mpm_event.so
猜测是新版 httpd-2.4.39 要求更高版本的 apr。另一个证据是,我在打包出 httpd-2.4.39 的 rpm 包后,将其安装到一台已经通过 yum install 安装 apr-1.4.8 和 apr-util-1.5.2 的服务器上,执行 httpd 命令时出现以下错误。我再把 apr-1.4.8 和 apr-util-1.5.2 卸载了,并通过 yum localinstall 安装自己打出来的 apr-1.7.0 和 apr-util-1.6.1 后,能正常运行 httpd。
打包安装 apr 和 apr-util
apr-util 依赖 apr,先打包安装 apr
yum install -y rpm-build
rpmbuild -tb apr-1.7.0.tar.bz2
可以看到打包还依赖一些组件:
用 yum install 安装这些组件,注意有些组件对版本号是有要求的,应该在安装前确认版本号是否符合要求:
依赖安装再执行 rpmbuild 命令。打包完成后,rpm 包存放在 /root/rpmbuild/RPMS/x86_64/,用 yum localinstall 安装
yum localinstall /root/rpmbuild/RPMS/x86_64/apr-1.7.0-1.x86_64.rpm
yum localinstall /root/rpmbuild/RPMS/x86_64/apr-devel-1.7.0-1.x86_64.rpm
打包安装 apr-util
rpmbuild -tb apr-util-1.6.1.tar.bz2
同样需要安装一些组件
yum install expat-devel db4-devel postgresql-devel mysql-devel sqlite-devel unixODBC-devel openldap-devel openssl-devel nss-devel
可能有的组件你的 yum 源没有,那就去文末的镜像网站找。比如我下载不到 db4-devel:
[root@localhost source]# rpmbuild -tb apr-util-1.6.1.tar.bz2
error: Failed build dependencies:
db4-devel is needed by apr-util-1.6.1-1.x86_64
[root@localhost source]# yum install db4-devel
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
No package db4-devel available.
Error: Nothing to do
经过搜索发现这个是 libdb4-devel 。它是 epel 的包,我就去镜像网站上的 epel 目录下找到并下载。
wget https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/l/libdb4-4.8.30-13.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/l/libdb4-devel-4.8.30-13.el7.x86_64.rpm
yum localinstall libdb4-4.8.30-13.el7.x86_64.rpm libdb4-devel-4.8.30-13.el7.x86_64.rpm
再次执行 rpmbuild 命令,如果遇到如下错误,则需执行 yum install libdb,可以理解为它需要这个包但没检查依赖吧。
安装打包好的 apr-util:
yum localinstall /root/rpmbuild/RPMS/x86_64/apr-util-1.6.1-1.x86_64.rpm
yum localinstall /root/rpmbuild/RPMS/x86_64/apr-util-devel-1.6.1-1.x86_64.rpm
打包安装 httpd
rpmbuild -tb httpd-2.4.39.tar.bz2
打包前同样需要安装依赖
安装依赖组件后,再次 rpmbuild,我遇到了这个问题:
意思是说,检测到有模块被安装但没有打包,网上有3种解决办法,其中第二种方法我没有成功:
(1)注释掉 /usr/lib/rpm/macros 中的这行,不进行该项检查。
(2)将 /usr/lib/rpm/macros 中的 %_unpackaged_files_terminate_build 变量值改为0,即遇到该错误只警告。
(3)将该模块也配置为打包到 rpm 中。解压 httpd 压缩包,编辑 httpd.spec,将 mod_socache_redis.so 配置到箭头处,再压缩成 tar.bz2。
tar jxf httpd-2.4.39.tar.bz2
cd httpd-2.4.39/
vim httpd.spec
在 396 行插入一行:
将修改后的文件夹打包回压缩格式
cd ..
// 将原压缩包重命名
mv httpd-2.4.39.tar.bz2 httpd-2.4.39.tar.bz2.bak
// 创建新压缩包
tar cjvf httpd-2.4.39.tar.bz2 httpd-2.4.39
重新进行 rpm 打包
rpmbuild -tb httpd-2.4.39.tar.bz2
安装打包好的 httpd
yum localinstall /root/rpmbuild/RPMS/x86_64/httpd-2.4.39-1.x86_64.rpm
查看版本,启动
参考链接
Apache 官方文档:http://httpd.apache.org/docs/2.4/platform/rpm.html
apr 和 apr-util 不兼容:http://www.it1352.com/505589.html
Apache rpm 国内镜像网站:https://mirrors.tuna.tsinghua.edu.cn/apache/
Epel rpm 国内镜像网站:https://mirrors.tuna.tsinghua.edu.cn/epel/