国产服务器操作系统编译nginx生成rpm包

2026 年 5 月 13 日,F5 和安全研究员 depthfirst 公布了一个 Nginx ngx_http_rewrite_module 模块中的堆缓冲区溢出漏洞,编号 CVE-2026-42945,被命名为"NGINX Rift"。攻击者只需发送一个精心构造的 HTTP 请求,就能在未认证的情况下执行任意代码或导致服务崩溃。修改该漏洞需要更新nginx的版本到1.30.2以上版本。

由于作者维护了几百个nginx实例,操作系统相对比较固定,基本都是OpenEuler2203,OpenEuler2403,UOSV20, KylinosV10这几个固定版本的系统,则可以将nginx编译生成nginx的rpm包,将打包的nginx软件分发到服务器上执行升级命令即可,这样节省了大量的编译时间

因此本文主要介绍基于UOS V20 1070A系统编译nginx1.30.2生成rpm包

一、安装编译环境

bash 复制代码
dnf -y install gcc gcc-c++ make cmake zlib zlib-devel openssl openssl-devel pcre-devel vim net-tools man wget tar

二、 准备软件包构建环境

安装构建依赖

bash 复制代码
# 安装构建rpm包依赖
dnf install -y rpm-build rpmdevtools

# 初始化构建目录结构
rpmdev-setuptree

目录结构

bash 复制代码
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
├── SOURCES
│   ├── nginx-1.30.2.tar.gz
│   └── nginx.service
├── SPECS
│   └── nginx.spec
└── SRPMS

三、准备构建文件

准备nginx编译构建文件

bash 复制代码
cat  > rpmbuild/SPECS/nginx.spec << EOF

Name:       nginx
Version:    1.30.2
Release:    0%{?dist}
Summary:    omstack

License:    GPL
URL:        http://www.omfox.cn
Source0:    nginx-1.30.2.tar.gz
Source1:    nginx.service

BuildRequires:  gettext

%description
Garena omstack-build .

%prep
%setup -q

%build
 ./configure  --prefix=/etc/nginx \
 --sbin-path=/usr/sbin/ \
 --modules-path=/usr/lib/nginx/modules \
 --conf-path=/etc/nginx/nginx.conf \
 --error-log-path=/var/log/nginx/error.log \
 --http-log-path=/var/log/nginx/access.log \
 --pid-path=/var/run/nginx.pid \
 --lock-path=/var/run/nginx.lock \
 --http-client-body-temp-path=/var/cache/nginx/client_temp \
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
 --with-compat \
 --with-threads \
 --with-http_addition_module \
 --with-http_auth_request_module \
 --with-http_dav_module \
 --add-module=/opt/src/nginx-rtmp-module \
 --with-http_flv_module --with-http_gunzip_module \
 --with-http_gzip_static_module \
 --with-http_mp4_module \
 --with-http_random_index_module \
 --with-http_realip_module \
 --with-http_secure_link_module \
 --with-http_slice_module \
 --with-http_ssl_module \
 --with-openssl=/opt/src/openssl-3.0.30 \
 --with-http_stub_status_module \
 --with-http_sub_module \
 --with-http_v2_module \
 --with-mail \
 --with-mail_ssl_module \
 --with-stream \
 --with-stream_realip_module \
 --with-stream_ssl_module \
 --with-stream_ssl_preread_module \
 --with-cc-opt='-static -static-libgcc' \
 --with-ld-opt=-static 


make %{?_smp_mflags}

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/etc/nginx
mkdir -p %{buildroot}/usr/sbin
mkdir -p %{buildroot}/var/log/nginx
mkdir -p %{buildroot}/var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp}
mkdir -p %{buildroot}/etc/nginx/{conf.d,sites-enabled}
mkdir -p %{buildroot}/usr/share/nginx/html
make install DESTDIR=%{buildroot}

install -D -m 0644 %{SOURCE1} %{buildroot}/%{_unitdir}/nginx.service

%post
mkdir -p /var/log/nginx
mkdir -p /var/cache/nginx/{client_temp,proxy_temp,astcgi_temp,uwsgi_temp,scgi_temp}
mkdir -p /etc/nginx/{conf.d,sites-enabled}
mkdir -p /usr/share/nginx/html/



%preun
systemctl --quiet is-active  && systemctl stop  >/dev/null || :

%postun
/usr/sbin/userdel  >/dev/null 2>&1 || :

%files
%defattr(-,root,root,-)
/etc/nginx/fastcgi.conf
/etc/nginx/fastcgi.conf.default
/etc/nginx/fastcgi_params
/etc/nginx/fastcgi_params.default
/etc/nginx/html/50x.html
/etc/nginx/html/index.html
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/mime.types.default
/etc/nginx/nginx.conf
/etc/nginx/nginx.conf.default
/etc/nginx/scgi_params
/etc/nginx/scgi_params.default
/etc/nginx/uwsgi_params
/etc/nginx/uwsgi_params.default
/etc/nginx/win-utf
/usr/sbin/nginx
%{_unitdir}/nginx.service

%changelog
* Wed May 20 2026 omstack <omstack@163.com> - 1.30.2
- Initial release of Nginx 1.30.2 for ARM64 with static OpenSSL 3.0.20
  
EOF

添加 systemd方式管理

bash 复制代码
cat  > rpmbuild/SOURCES/nginx.service <<EOF
[Unit]
Description= - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
User=root
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

EOF

准备nginx编译源码包

bash 复制代码
wget  https://nginx.org/download/nginx-1.30.2.tar.gz -O  $HOME/rpmbuild/SOURCES/nginx-1.30.2.tar.gz
mkdir -p /opt/src/
wget "https://release-assets.githubusercontent.com/github-production-release-asset/7634677/bc462459-fa7e-49c8-ac75-d5b1e6815328?sp=r&sv=2018-11-09&sr=b&spr=https&se=2026-05-22T04%3A52%3A52Z&rscd=attachment%3B+filename%3Dopenssl-3.0.20.tar.gz&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2026-05-22T03%3A52%3A04Z&sks=b&skv=2018-11-09&sig=jC5XGMKptToXNxO7ewNdqA%2BggQx4EnGdG796LE5l6b8%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc3OTQyMzkwOSwibmJmIjoxNzc5NDIyMTA5LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.AljDjwz9q-AQGSJZjPNuFjsjPq5Rl8Uo5JftwEPZukY&response-content-disposition=attachment%3B%20filename%3Dopenssl-3.0.20.tar.gz&response-content-type=application%2Foctet-stream"  -O /opt/src/openssl-3.0.20.tar.gz

四、构建RPM包

bash 复制代码
cd /root/rpmbuild/SPECS
rpmbuild -bb nginx.spec

五、获取rpm包

编译后的rpm包位于${HOME}/rpmbuild/RPMS/x86_64 目录下。

注意: 尽量在相同内核版本的操作系统中安装,可以避免因glibc或者其他系统依赖差别过大导致的安装胡总启动报错。

相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜5 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB6 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220708 天前
如何搭建本地yum源(上)
运维
ping某9 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8811 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql