Files
angie/angie.spec

585 lines
19 KiB
RPMSpec

%global _hardened_build 1
%global angie_user angie
# Disable strict symbol checks in the link editor.
# See: https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
%undefine _strict_symbol_defs_build
%if 0%{?fedora} || 0%{?epel} == 8
%bcond_without geoip
%else
%bcond_with geoip
%endif
# gperftools support should be disabled for RHEL >= 8
# see: https://bugzilla.redhat.com/show_bug.cgi?id=1931402
%if 0%{?rhel} >= 8
%global with_gperftools 0
%else
# gperftools exists only on selected arches
# gperftools *detection* is failing on ppc64*, possibly only configure
# bug, but disable anyway.
%ifnarch s390 s390x ppc64 ppc64le
%global with_gperftools 1
%endif
%endif
%global with_aio 1
%if 0%{?fedora} > 40 || 0%{?rhel} > 9
%bcond_with engine
%else
%bcond_without engine
%endif
# kTLS requires OpenSSL 3.0 (default in F36+ and EL9+, available in EPEL8)
%if 0%{?fedora} >= 36 || 0%{?rhel} >= 9 || 0%{?epel} >= 8
%global with_ktls 1
%endif
# Build against OpenSSL 3 on EL8
%if 0%{?epel} == 8
%global openssl_pkgversion 3
%endif
%global angie_abiversion %{version}
%global angie_moduledir %{_libdir}/angie/modules
%global angie_moduleconfdir %{_datadir}/angie/modules
%global angie_srcdir %{_usrsrc}/%{name}-%{version}-%{release}
# Perl module is still called "nginx"; keep it out of the system perl
# paths so it does not conflict with nginx-mod-http-perl.
%global angie_perldir %{_libdir}/angie/perl
# Do not generate provides/requires from angie sources, and do not let the
# private perl module provide perl(nginx)
%global __provides_exclude_from ^(%{angie_srcdir}|%{angie_perldir})/.*$
%global __requires_exclude_from ^%{angie_srcdir}/.*$
Name: angie
Version: 1.12.4
Release: 1%{?dist}
Summary: Efficient, powerful and scalable web server, nginx fork
License: BSD-2-Clause
URL: https://angie.software
Source0: https://download.angie.software/files/angie-%{version}.tar.gz
Source1: https://download.angie.software/files/angie-%{version}.tar.gz.asc
Source2: https://angie.software/keys/angie-signing.gpg.asc
Source10: angie.service
Source11: angie.logrotate
Source12: angie.conf
Source13: angie-upgrade
Source15: macros.angiemods.in
Source16: angiemods.attr
Source18: angie@.service
Source19: angie.sysusers
Source20: angie.tmpfiles
Source200: README.dynamic
Source220: instance.conf
# removes -Werror in upstream build scripts. -Werror conflicts with
# -D_FORTIFY_SOURCE=2 causing warnings to turn into errors.
Patch0: 0001-remove-Werror-in-upstream-build-scripts.patch
# downstream patch (from Fedora nginx) - Disable ENGINE support by default
# for F41+
Patch1: 0002-Disable-ENGINE-support.patch
# downstream patch (from Fedora nginx) - Compile perl module with O2
Patch2: 0003-Compile-perl-module-with-O2.patch
BuildRequires: make
BuildRequires: gcc
%if 0%{?fedora} > 42
BuildRequires: openpgpverify
%else
BuildRequires: gnupg2
%endif
%if 0%{?with_gperftools}
BuildRequires: gperftools-devel
%endif
BuildRequires: libxcrypt-devel
BuildRequires: openssl%{?openssl_pkgversion}-devel
BuildRequires: pcre2-devel
BuildRequires: perl-podlators
%if 0%{?fedora} || 0%{?rhel} >= 10 || 0%{?epel} >= 9
BuildRequires: zlib-ng-devel
%else
BuildRequires: zlib-devel
%endif
Requires: angie-filesystem = %{version}-%{release}
Provides: webserver
Recommends: logrotate
Requires: %{name}-core = %{version}-%{release}
BuildRequires: systemd
BuildRequires: systemd-rpm-macros
%{?systemd_requires}
%description
Angie is an efficient, powerful, and scalable web server that was forked
from nginx. It is a web server and a reverse proxy server for HTTP, SMTP,
POP3 and IMAP protocols, with a strong focus on high concurrency,
performance and low memory usage.
Compared to nginx it adds a built-in ACME client, a REST API with
Prometheus metrics, active upstream health probes, dynamic upstream
configuration via Docker labels and other features.
%package core
Summary: Angie minimal core
Requires: openssl%{?openssl_pkgversion}-libs
Requires(pre): angie-filesystem
# For external angie modules
Provides: angie(abi) = %{angie_abiversion}
%description core
Angie minimal core.
%package all-modules
Summary: A meta package that installs all available Angie modules
BuildArch: noarch
%if %{with geoip}
Requires: angie-mod-http-geoip = %{version}-%{release}
Requires: angie-mod-stream-geoip = %{version}-%{release}
%endif
Requires: angie-mod-http-image-filter = %{version}-%{release}
Requires: angie-mod-http-perl = %{version}-%{release}
Requires: angie-mod-http-xslt-filter = %{version}-%{release}
Requires: angie-mod-mail = %{version}-%{release}
Requires: angie-mod-stream = %{version}-%{release}
%description all-modules
Meta package that installs all available Angie modules.
%package filesystem
Summary: The basic directory layout for the Angie server
BuildArch: noarch
# RHEL 9 compat, remove after RHEL 9 EOL
%{?sysusers_requires_compat}
%description filesystem
The angie-filesystem package contains the basic directory layout
for the Angie server including the correct permissions for the
directories.
%if %{with geoip}
%package mod-http-geoip
Summary: Angie HTTP geoip module
BuildRequires: GeoIP-devel
Requires: angie(abi) = %{angie_abiversion}
%description mod-http-geoip
%{summary}.
%package mod-stream-geoip
Summary: Angie stream geoip module
BuildRequires: GeoIP-devel
Requires: angie(abi) = %{angie_abiversion}
Requires: angie-mod-stream = %{version}-%{release}
%description mod-stream-geoip
%{summary}.
%endif
%package mod-http-image-filter
Summary: Angie HTTP image filter module
BuildRequires: gd-devel
Requires: angie(abi) = %{angie_abiversion}
Requires: gd
%description mod-http-image-filter
%{summary}.
%package mod-http-perl
Summary: Angie HTTP perl module
BuildRequires: perl-devel
BuildRequires: perl-generators
BuildRequires: perl(ExtUtils::Embed)
Requires: angie(abi) = %{angie_abiversion}
Requires: perl(constant)
%description mod-http-perl
%{summary}.
%package mod-http-xslt-filter
Summary: Angie XSLT module
BuildRequires: libxslt-devel
Requires: angie(abi) = %{angie_abiversion}
%description mod-http-xslt-filter
%{summary}.
%package mod-mail
Summary: Angie mail modules
Requires: angie(abi) = %{angie_abiversion}
%description mod-mail
%{summary}.
%package mod-stream
Summary: Angie stream modules
Requires: angie(abi) = %{angie_abiversion}
%description mod-stream
%{summary}.
%package mod-devel
Summary: Angie module development files
Requires: angie = %{version}-%{release}
Requires: make
Requires: gcc
Requires: gd-devel
%if 0%{?with_gperftools}
Requires: gperftools-devel
%endif
%if %{with geoip}
Requires: GeoIP-devel
%endif
Requires: libxslt-devel
Requires: openssl%{?openssl_pkgversion}-devel
Requires: pcre2-devel
Requires: perl-devel
Requires: perl(ExtUtils::Embed)
%if 0%{?fedora} || 0%{?rhel} >= 10 || 0%{?epel} >= 9
Requires: zlib-ng-devel
%else
Requires: zlib-devel
%endif
%description mod-devel
%{summary}.
%prep
%if 0%{?fedora} > 42
%{openpgpverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
%else
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
%endif
%autosetup -p1
cp %{SOURCE200} %{SOURCE10} %{SOURCE12} %{SOURCE18} %{SOURCE220} .
%if 0%{?openssl_pkgversion}
sed \
-e 's|\(ngx_feature_path=\)$|\1%{_includedir}/openssl%{openssl_pkgversion}|' \
-e 's|\(ngx_feature_libs="\)|\1-L%{_libdir}/openssl%{openssl_pkgversion} |' \
-i auto/lib/openssl/conf
%endif
# Prepare template config for instances
sed -e '/^error_log /s|error\.log|@INSTANCE@_error.log|' \
-e '/^pid /s|angie\.pid|angie-@INSTANCE@.pid|' \
-e '/^ *access_log/s|access\.log|@INSTANCE@_access.log|' \
angie.conf >> instance.conf
touch -r %{SOURCE12} instance.conf
# Prepare sources for installation
cp -a ../%{name}-%{version} ../%{name}-%{version}-%{release}-src
mv ../%{name}-%{version}-%{release}-src .
%build
# angie does not utilize a standard configure script. It has its own
# and the standard configure options cause the angie configure script
# to error out.
if ! ./configure \
--prefix=%{_datadir}/angie \
--sbin-path=%{_sbindir}/angie \
--modules-path=%{angie_moduledir} \
--conf-path=%{_sysconfdir}/angie/angie.conf \
--error-log-path=%{_localstatedir}/log/angie/error.log \
--http-log-path=%{_localstatedir}/log/angie/access.log \
--http-client-body-temp-path=%{_localstatedir}/lib/angie/tmp/client_body \
--http-proxy-temp-path=%{_localstatedir}/lib/angie/tmp/proxy \
--http-fastcgi-temp-path=%{_localstatedir}/lib/angie/tmp/fastcgi \
--http-uwsgi-temp-path=%{_localstatedir}/lib/angie/tmp/uwsgi \
--http-scgi-temp-path=%{_localstatedir}/lib/angie/tmp/scgi \
--http-acme-client-path=%{_localstatedir}/lib/angie/acme \
--pid-path=/run/angie.pid \
--lock-path=/run/lock/subsys/angie \
--user=%{angie_user} \
--group=%{angie_user} \
--with-compat \
--with-debug \
%if 0%{?with_aio}
--with-file-aio \
%endif
%if 0%{?with_gperftools}
--with-google_perftools_module \
%endif
--with-http_acme_module \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_degradation_module \
--with-http_flv_module \
%if %{with geoip}
--with-http_geoip_module=dynamic \
--with-stream_geoip_module=dynamic \
%endif
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_mp4_module \
--with-http_perl_module=dynamic \
--with-perl_modules_path=%{angie_perldir} \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-http_v3_module \
--with-http_xslt_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
%if 0%{?with_ktls}
--with-openssl-opt=enable-ktls \
%endif
%if %{without engine}
--without-engine \
%endif
--with-pcre \
--with-pcre-jit \
--with-stream=dynamic \
--with-stream_acme_module \
--with-stream_mqtt_preread_module \
--with-stream_rdp_preread_module \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-threads \
--with-cc-opt="%{optflags}" \
--with-ld-opt="$RPM_LD_FLAGS"; then
: configure failed
cat objs/autoconf.err
exit 1
fi
%make_build
%install
%make_install INSTALLDIRS=vendor
find %{buildroot} -type f -name .packlist -exec rm -f '{}' \;
find %{buildroot} -type f -name perllocal.pod -exec rm -f '{}' \;
find %{buildroot} -type f -empty -exec rm -f '{}' \;
find %{buildroot} -type f -iname '*.so' -exec chmod 0755 '{}' \;
# Perl module man page is named nginx(3pm) and would conflict with
# nginx-mod-http-perl.
rm -rf %{buildroot}%{_mandir}/man3 %{buildroot}%{angie_perldir}/man3
install -p -D -m 0644 ./angie.service \
%{buildroot}%{_unitdir}/angie.service
install -p -D -m 0644 ./angie@.service \
%{buildroot}%{_unitdir}/angie@.service
install -p -D -m 0644 %{SOURCE11} \
%{buildroot}%{_sysconfdir}/logrotate.d/angie
install -p -d -m 0755 %{buildroot}%{_sysconfdir}/systemd/system/angie.service.d
install -p -d -m 0755 %{buildroot}%{_unitdir}/angie.service.d
install -p -d -m 0755 %{buildroot}%{_sysconfdir}/angie/conf.d
install -p -d -m 0755 %{buildroot}%{_sysconfdir}/angie/default.d
install -p -d -m 0700 %{buildroot}%{_localstatedir}/lib/angie
install -p -d -m 0700 %{buildroot}%{_localstatedir}/lib/angie/tmp
install -p -d -m 0700 %{buildroot}%{_localstatedir}/lib/angie/acme
install -p -d -m 0700 %{buildroot}%{_localstatedir}/log/angie
install -p -d -m 0755 %{buildroot}%{_datadir}/angie/html
install -p -d -m 0755 %{buildroot}%{angie_moduleconfdir}
install -p -d -m 0755 %{buildroot}%{angie_moduledir}
install -p -m 0644 ./angie.conf \
%{buildroot}%{_sysconfdir}/angie
install -p -D -m 0644 %{_builddir}/angie-%{version}/objs/angie.8 \
%{buildroot}%{_mandir}/man8/angie.8
install -p -D -m 0755 %{SOURCE13} %{buildroot}%{_bindir}/angie-upgrade
pod2man --section=8 --name=angie-upgrade \
--release="%{version}-%{release}" \
--center="Angie Zero-Downtime Upgrade Utility" \
--date="$(sed -nE 's/# Last updated: (.+)/\1/p' %{SOURCE13})" \
%{SOURCE13} > %{buildroot}%{_mandir}/man8/angie-upgrade.8
for i in ftdetect ftplugin indent syntax; do
install -p -D -m644 contrib/vim/${i}/angie.vim \
%{buildroot}%{_datadir}/vim/vimfiles/${i}/angie.vim
done
%if %{with geoip}
echo 'load_module "%{angie_moduledir}/ngx_http_geoip_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-http-geoip.conf
echo 'load_module "%{angie_moduledir}/ngx_stream_geoip_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/zz-mod-stream-geoip.conf
%endif
echo 'load_module "%{angie_moduledir}/ngx_http_image_filter_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-http-image-filter.conf
echo 'load_module "%{angie_moduledir}/ngx_http_perl_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-http-perl.conf
echo 'load_module "%{angie_moduledir}/ngx_http_xslt_filter_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-http-xslt-filter.conf
echo 'load_module "%{angie_moduledir}/ngx_mail_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-mail.conf
echo 'load_module "%{angie_moduledir}/ngx_stream_module.so";' \
> %{buildroot}%{angie_moduleconfdir}/mod-stream.conf
# Install files for supporting angie module builds
## Install source files
mkdir -p %{buildroot}%{_usrsrc}
mv %{name}-%{version}-%{release}-src %{buildroot}%{angie_srcdir}
## Install rpm macros
mkdir -p %{buildroot}%{_rpmmacrodir}
sed -e "s|@@ANGIE_ABIVERSION@@|%{angie_abiversion}|g" \
-e "s|@@ANGIE_MODDIR@@|%{angie_moduledir}|g" \
-e "s|@@ANGIE_MODCONFDIR@@|%{angie_moduleconfdir}|g" \
-e "s|@@ANGIE_SRCDIR@@|%{angie_srcdir}|g" \
%{SOURCE15} > %{buildroot}%{_rpmmacrodir}/macros.angiemods
## Install dependency generator
install -Dpm0644 %{SOURCE16} %{buildroot}%{_fileattrsdir}/angiemods.attr
# install sysusers file
install -p -D -m 0644 %{SOURCE19} %{buildroot}%{_sysusersdir}/angie.conf
# tmpfiles.d configuration
mkdir -p %{buildroot}%{_tmpfilesdir}
install -m 644 -p %{SOURCE20} %{buildroot}%{_tmpfilesdir}/angie.conf
%pre filesystem
# RHEL 9 compat, remove after RHEL 9 EOL
%sysusers_create_compat %{SOURCE19}
%post
%systemd_post angie.service
%preun
%systemd_preun angie.service
%postun
%systemd_postun angie.service
# Request zero-downtime upgrade upon installation of a new angie binary or modules
# A reload is not sufficient here: https://blog.nginx.org/blog/nginx-dynamic-modules-how-they-work#upgradeMod
%transfiletriggerin -- %{_sbindir}/angie %{angie_moduleconfdir} %{angie_moduledir}
if [ $1 -ge 1 ]; then
test -f %{_sysconfdir}/angie/rpm-disable-upgrade || /usr/bin/angie-upgrade >/dev/null 2>&1 || :
fi
%files
%doc instance.conf
%{_datadir}/angie/html/*
%{_bindir}/angie-upgrade
%{_datadir}/vim/vimfiles/ftdetect/angie.vim
%{_datadir}/vim/vimfiles/ftplugin/angie.vim
%{_datadir}/vim/vimfiles/syntax/angie.vim
%{_datadir}/vim/vimfiles/indent/angie.vim
%{_mandir}/man8/angie.8*
%{_mandir}/man8/angie-upgrade.8*
%{_unitdir}/angie.service
%{_unitdir}/angie@.service
%config(noreplace) %{_sysconfdir}/logrotate.d/angie
%files core
%license LICENSE
%doc CHANGES README README.dynamic
%{_sbindir}/angie
%config(noreplace) %{_sysconfdir}/angie/fastcgi.conf
%config(noreplace) %{_sysconfdir}/angie/fastcgi.conf.default
%config(noreplace) %{_sysconfdir}/angie/fastcgi_params
%config(noreplace) %{_sysconfdir}/angie/fastcgi_params.default
%config(noreplace) %{_sysconfdir}/angie/koi-utf
%config(noreplace) %{_sysconfdir}/angie/koi-win
%config(noreplace) %{_sysconfdir}/angie/mime.types
%config(noreplace) %{_sysconfdir}/angie/mime.types.default
%config(noreplace) %{_sysconfdir}/angie/angie.conf
%config(noreplace) %{_sysconfdir}/angie/angie.conf.default
%config(noreplace) %{_sysconfdir}/angie/prometheus_all.conf
%config(noreplace) %{_sysconfdir}/angie/prometheus_all.conf.default
%config(noreplace) %{_sysconfdir}/angie/scgi_params
%config(noreplace) %{_sysconfdir}/angie/scgi_params.default
%config(noreplace) %{_sysconfdir}/angie/uwsgi_params
%config(noreplace) %{_sysconfdir}/angie/uwsgi_params.default
%config(noreplace) %{_sysconfdir}/angie/win-utf
%attr(770,%{angie_user},root) %dir %{_localstatedir}/lib/angie
%attr(770,%{angie_user},root) %dir %{_localstatedir}/lib/angie/tmp
%attr(700,root,root) %dir %{_localstatedir}/lib/angie/acme
%{_tmpfilesdir}/angie.conf
%ghost %attr(640,%{angie_user},root) %{_localstatedir}/log/angie/access.log
%ghost %attr(640,%{angie_user},root) %{_localstatedir}/log/angie/error.log
%dir %{_libdir}/angie
%dir %{angie_moduledir}
%dir %{angie_moduleconfdir}
%files all-modules
%files filesystem
%dir %{_datadir}/angie
%dir %{_datadir}/angie/html
%dir %{_sysconfdir}/angie
%dir %{_sysconfdir}/angie/conf.d
%dir %{_sysconfdir}/angie/default.d
%dir %{_sysconfdir}/systemd/system/angie.service.d
%dir %{_unitdir}/angie.service.d
%attr(711,root,root) %dir %{_localstatedir}/log/angie
%{_sysusersdir}/angie.conf
%if %{with geoip}
%files mod-http-geoip
%{angie_moduleconfdir}/mod-http-geoip.conf
%{angie_moduledir}/ngx_http_geoip_module.so
%files mod-stream-geoip
%{angie_moduleconfdir}/zz-mod-stream-geoip.conf
%{angie_moduledir}/ngx_stream_geoip_module.so
%endif
%files mod-http-image-filter
%{angie_moduleconfdir}/mod-http-image-filter.conf
%{angie_moduledir}/ngx_http_image_filter_module.so
%files mod-http-perl
%{angie_moduleconfdir}/mod-http-perl.conf
%{angie_moduledir}/ngx_http_perl_module.so
%{angie_perldir}/
%files mod-http-xslt-filter
%{angie_moduleconfdir}/mod-http-xslt-filter.conf
%{angie_moduledir}/ngx_http_xslt_filter_module.so
%files mod-mail
%{angie_moduleconfdir}/mod-mail.conf
%{angie_moduledir}/ngx_mail_module.so
%files mod-stream
%{angie_moduleconfdir}/mod-stream.conf
%{angie_moduledir}/ngx_stream_module.so
%files mod-devel
%{_rpmmacrodir}/macros.angiemods
%{_fileattrsdir}/angiemods.attr
%{angie_srcdir}/
%changelog
* Sun Oct 18 2026 Zoran Pericic <zpericic@netst.org> - 1.12.4-1
- Initial package, based on Fedora nginx 1.30.6 packaging
- Dropped Fedora nginx PIDFile patch (Angie syncs daemon PID file itself)
- Dropped Fedora nginx SSL passphrase dialog patch (does not apply)
- Enable ACME (http + stream), MQTT and RDP preread modules
- Perl module installed into private angie libdir path