概览:
准备 具体细节以及说明可以参考这位作者的How to Build Your Own Nginx RPM from Source
依赖安装 工具包 1 2 yum install --enablerepo=epel yum-utils rpmdevtools yum groupinstall --enablerepo=epel 'Development Tools'
源码及依赖 nginx
1 wget http://nginx.org/download/nginx-1.23.3.tar.gz
openssl
1 wget https://www.openssl.org/source/openssl-3.0.8.tar.gz
nginx-module-vts
1 2 wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.1.tar.gz mv v0.2.1.tar.gz nginx-module-vts-0.2.1.tar.gz
依赖
nginx
openssl
perl-FindBin (or full install perl
) rpm打包配置 配置源码以及依赖 vim ~/.rpmmacros
,根据自己的需求可以修改第一行的topdir的值,指向你想要的工作目录,我设置的是家目录下的rpmbuild。
1 2 3 4 5 [root@workspace ~]# cat ~/.rpmmacros %_topdir %(echo $HOME)/rpmbuild %_smp_mflags -j2 %__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot %_query_all_fmt %%{name}-%%{version}-%%{release}.%%{arch}
然后进入到工作目录并初始化工作空间,初始化后回生成一些目录。
1 2 cd $(echo $HOME)/rpmbuild rpmdev-setuptree
生成的目录结构如下
1 2 3 4 5 6 -- rpmbuild |-- BUILD |-- RPMS |-- SOURCES |-- SPECS |-- SRPMS
现阶段,主要是SOURCES,现在讲上一章下载好的压缩包复制到该目录下。我还将我需要的有关nginx的systemctl配置文件和日志切割的配置也放进来了。
1 2 3 4 5 6 -- rpmbuild/SOURCES |-- nginx-1.23.3.tar.gz |-- openssl-3.0.8.tar.gz |-- nginx-module-vts-0.2.1.tar.gz |-- nginx.service |-- nginx.logrotate
nginx.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/bin/mkdir -p /var/tmp/nginx ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
nginx.logrotate
1 2 3 4 5 6 7 8 9 10 11 12 /usr/local/nginx/logs/*.log { daily rotate 180 missingok notifempty compress dateext sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || /bin/kill -USR1 $(cat /var/run/nginx.pid) endscript }
编写rpm打包配置 rpmbuild/SPECS/nginx.spec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 %define nginx_user nginx%define nginx_group nginx%define nginx_home %{_localstatedir} /cache/nginx%define nginx_version 1.23 .4 %define openssl_version 3.0 .8 %define nginx_vts_version 0 .2.1 %define use_systemd (0 %{?rhel} && 0 %{?rhel} >= 7 )%if 0 %{?rhel} == 7 Group: System Environment/Daemons Requires(pre): shadow-utils Requires: systemd BuildRequires: systemd BuildRequires: perl, zlib-devel, pcre2-devel %define with_spdy 1 %endif Name: nginx Version: %{nginx_version} Release: el9 Summary: Nginx %{nginx_version} High performance web server Group: System Environment/Daemons License: 2 -clause BSD-like license Source0: nginx-%{nginx_version} .tar.gz Source1: openssl-%{openssl_version} .tar.gz Source2: nginx-module-vts-%{nginx_vts_version} .tar.gz Source3: nginx.conf Source4: default.conf Source5: nginx.service Source6: nginx.logrotate Provides: webserver %description nginx [engine x ] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. %prep %{__tar} zxf %{SOURCE0} %{__tar} zxf %{SOURCE1} %{__tar} zxf %{SOURCE2} %setup -T -D -a 0 %build ./configure --prefix=/usr/l ocal/nginx \ --sbin-path=/usr/l ocal/nginx/sbin/nginx \ --conf-path=/usr/l ocal/nginx/conf/nginx.conf \ --error-log -path=/usr/l ocal/nginx/logs/error.log \ --http-log -path=/usr/l ocal/nginx/logs/access.log \ --pid-path=/var/run /nginx.pid \ --user=%{nginx_user} \ --group=%{nginx_group} \ --lock-path=/var/l ock/nginx.lock \ --http-client-body-temp-path=%{_localstatedir} /cache/nginx/client \ --http-proxy-temp-path=%{_localstatedir} /cache/nginx/proxy \ --http-fastcgi-temp-path=%{_localstatedir} /cache/nginx/fcgi \ --http-uwsgi-temp-path=%{_localstatedir} /cache/nginx/uwsgi \ --http-scgi-temp-path=%{_localstatedir} /cache/nginx/scgi \ --with-openssl=%{_builddir} /openssl-%{openssl_version} \ --add-module=%{_builddir} /nginx-module-vts-%{nginx_vts_version} \ --with-http_realip_module \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_addition_module \ --with-http_gzip_static_module \ --with-http_sub_module \ --with-http_auth_request_module \ --with-pcre --with-http_v2_module --with-file-aio make %{?_smp_mflags} OPTIMIZE="%{optflags} " %install %{__rm} -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install%{__mkdir} -p $RPM_BUILD_ROOT /%{_localstatedir} /cache/nginx%{__rm} $RPM_BUILD_ROOT /usr/local /nginx/conf/nginx.conf%{__install} -m644 -p %{SOURCE3} $RPM_BUILD_ROOT /usr/local /nginx/conf/nginx.conf%{__mkdir} -p $RPM_BUILD_ROOT /usr/local /nginx/conf.d%{__mkdir} -p $RPM_BUILD_ROOT /usr/local /nginx/conf.d/certs%{__mkdir} -p $RPM_BUILD_ROOT /usr/local /nginx/conf.d/vhost%{__install} -m644 -p %{SOURCE4} $RPM_BUILD_ROOT /usr/local /nginx/conf.d/default.conf%{__mkdir} -p $RPM_BUILD _ROOT%{_unitdir} %{__install} -m644 %SOURCE5 $RPM_BUILD _ROOT%{_unitdir} /nginx.service%{__mkdir} -p $RPM_BUILD _ROOT%{_sysconfdir} /logrotate.d%{__install} -m644 -p %{SOURCE6} $RPM_BUILD _ROOT%{_sysconfdir} /logrotate.d/nginx%clean %{__rm} -rf $RPM_BUILD_ROOT %files %defattr (-,root,root)/usr/local /nginx/* %{_unitdir} /nginx.service%{_localstatedir} /cache/nginx%config (noreplace) %{_sysconfdir} /logrotate.d/nginx%pre getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group} getent passwd %{nginx_user} >/dev/null || \ useradd -r -g %{nginx_group} -s /sbin/nologin \ -d %{nginx_home} -c "nginx user" %{nginx_user} exit 0 %post /usr/bin/systemctl preset nginx.service >/dev/null 2 >&1 ||: %changelog
最终工作空间目录如下 注意⚠️ SOURCES里面的文件就是构建rpm包所需要的所有原材料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 rpmbuild ├── BUILD ├── BUILDROOT ├── RPMS │ └── x86_64 │ ├── nginx-1.23.3-el9.x86_64.rpm │ ├── nginx-debuginfo-1.23.3-el9.x86_64.rpm │ └── nginx-debugsource-1.23.3-el9.x86_64.rpm ├── SOURCES │ ├── default.conf │ ├── nginx-1.23.4.tar.gz │ ├── nginx-module-vts-0.2.1.tar.gz │ ├── nginx.conf │ ├── nginx.logrotate │ ├── nginx.service │ └── openssl-3.0.8.tar.gz ├── SPECS │ └── nginx.spec └── SRPMS └── nginx-1.23.3-1.23.3.src.rpm 8 directories, 12 files
开始构建 1 rpmbuild -bb ~/rpmbuild/SPECS/nginx.spec
然后等待即可,如有报错,根据报错信息解决即可。
enjoy 最后会在rpmbuild/RPMS
里面会生成当前CPU架构的rpm包,一般只需要取没有debug信息的那个即可。
Hi there, I’m Mardan(ka1i).