制作nginx的rpm包

概览:

准备

具体细节以及说明可以参考这位作者的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

    • zlib-devel
    • pcre2-devel
  • 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


# distribution specific definitions
%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/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/var/run/nginx.pid \
--user=%{nginx_user} \
--group=%{nginx_group} \
--lock-path=/var/lock/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
# Add the "nginx" user
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
# Register the nginx service
/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信息的那个即可。