要将源码编译安装的nginx转为rpm包,核心是重新走标准rpm构建流程:先安装rpm-build等依赖,执行rpmdev-setuptree创建目录结构,将源码放入sources、编写.spec文件(configure用--prefix=/usr、install加destdir=%{buildroot}),最后rpmbuild -ba构建,生成rpm包存于rpms/x86_64/下。

直接用源码编译安装的 nginx,默认不会生成 RPM 包。要把它转成 RPM,核心不是“把已安装的程序打包”,而是**重新走标准 RPM 构建流程**:从源码开始,用 rpmbuild 按规范编译、安装到构建根目录(%{buildroot}),再自动打包成 RPM。关键在于控制安装路径和文件归属,而不是事后抓取 /usr/local/nginx 目录硬塞进去。
准备构建环境与目录结构
确保系统已安装基础工具:
- 运行
yum install -y rpm-build rpmdevtools gcc pcre-devel zlib-devel openssl-devel(CentOS/RHEL)或dnf install -y rpm-build rpmdevtools @development-tools pcre-devel zlib-devel openssl-devel(Fedora/Rocky 9+) - 执行
rpmdev-setuptree,自动在$HOME/rpmbuild/下创建标准目录:SOURCES、SPECS、BUILD、RPMS、SRPMS -
SOURCES放源码包(如nginx-1.24.0.tar.gz),SPECS放.spec配置文件
编写符合源码安装逻辑的 .spec 文件
重点是让 %build 和 %install 阶段复现你原本的手动编译过程,但目标路径必须可控:
-
./configure的--prefix必须设为%{_prefix}或明确路径(如/usr),不能写死/usr/local/nginx;否则安装时会越权写系统目录,rpmbuild会报错 -
%install阶段用make install DESTDIR=%{buildroot},确保所有文件落到构建根目录下,而非真实系统 -
%files列出的是%{buildroot}中实际生成的路径,例如:%{_sbindir}/nginx%{_sysconfdir}/nginx/%{_datadir}/nginx/ - 若需保留你原来
/usr/local/nginx的布局,可在%install中用cp -r复制,但必须复制到%{buildroot}/usr/local/nginx,且%files要对应写全路径
执行构建并验证结果
进入 ~/rpmbuild/SPECS 目录,运行:
-
rpmbuild -ba nginx.spec—— 全流程构建(预处理→编译→安装→打包) - 成功后,RPM 包生成在
~/rpmbuild/RPMS/<arch>/</arch>(如x86_64)下,文件名形如nginx-1.24.0-1.el9.x86_64.rpm - 用
rpm -qpi xxx.rpm查看元信息,rpm -qpl xxx.rpm确认文件列表是否符合预期 - 本地测试安装:
sudo rpm -ivh xxx.rpm,检查服务是否可启、配置是否就位
常见坑点提醒
避免几个高频错误:
- 没装
pcre-devel等依赖,./configure报错中断,构建失败 -
%install阶段漏写DESTDIR=%{buildroot},导致make install直接写进当前系统,破坏环境且打包为空 -
%files列了不存在的路径,或权限/属主不匹配(如%attr(0755,root,root)未声明),导致构建警告或安装失败 - 想跳过编译直接打包已安装目录?不推荐。可用
fpm工具快速封装,但失去 RPM 的依赖声明、校验、脚本等核心能力











