我尝试自定义修改了nginx.org的RPM包,在Fedora Copr上进行构建并分发
由于 2015 年 nginx 倒数日历的 12 月 4 日(星期五)的空档已经过去了,所以我现在决定写下这篇文章并进行发布。
首先
nginx在CentOS 7中包含在epel中,但版本已经过时。最近,我们一直在利用nginx: download的yum仓库。然而,如果需要使用lua或其他附加模块,则需要从源代码进行构建。
虽然在Qiita上有关于通过nginx-build构建nginx的方法介绍,但也希望能够在CentOS上通过rpm进行管理。
因此,我在Fedora项目的copr服务中尝试构建和分发ngnx的rpm。
关于我创建的nginx的rpm
我已将在 Travis CI 上使用 Docker 构建 Nginx 的 SRPM 以便在 COPR 上进行构建所需的文件放在了 GitHub 上的 hnakamur/nginx-rpm 项目中。
我正在基于nginx.org的rpm的spec文件构建以下3个模块。
-
- openresty/lua-nginx-module
-
- yaoweibin/nginx_upstream_check_module
- replay/ngx_http_consistent_hash
创建SRPM
SRPM的构建步骤写在Dockerfile中。以下是其主要部分摘录:
…(略)…
&& cd /root/rpmbuild/SRPMS \
&& curl -sLO http://nginx.org/packages/mainline/centos/7/SRPMS/nginx-${NGINX_VERSION}-1.el7.ngx.src.rpm \
&& rpm -i nginx-${NGINX_VERSION}-1.el7.ngx.src.rpm \
&& cd /root/rpmbuild/SOURCES \
&& curl -sLO https://github.com/openresty/lua-nginx-module/archive/v${NGX_LUA_VERSION}.tar.gz#/lua-nginx-module-${NGX_LUA_VERSION}.tar.gz \
&& curl -sLO https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.tar.gz#/nginx_upstream_check_module-master.tar.gz \
&& curl -sLO https://github.com/replay/ngx_http_consistent_hash/archive/master.tar.gz#/ngx_http_consistent_hash-master.tar.gz
ADD nginx.spec.patch /root/rpmbuild/SPECS/
RUN cd /root/rpmbuild/SPECS \
&& patch -p0 < nginx.spec.patch \
&& rpmbuild -bs nginx.spec
…(略)…
我们在 nginx.org 提供的 rpm 中应用了以下补丁到 nginx.spec 文件中。
--- nginx.spec.orig 2015-11-18 00:07:19.000000000 +0900
+++ nginx.spec 2015-12-06 17:51:40.000000000 +0900
@@ -74,11 +74,16 @@
Source9: nginx.upgrade.sh
Source10: nginx.suse.logrotate
+Source100: https://github.com/openresty/lua-nginx-module/archive/v0.9.19.tar.gz#/lua-nginx-module-0.9.19.tar.gz
+Source101: https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.tar.gz#/nginx_upstream_check_module-master.tar.gz
+Source102: https://github.com/replay/ngx_http_consistent_hash/archive/master.tar.gz#/ngx_http_consistent_hash-master.tar.gz
+
License: 2-clause BSD-like license
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: zlib-devel
BuildRequires: pcre-devel
+BuildRequires: luajit-devel
Provides: webserver
@@ -98,7 +103,8 @@
%endif
%prep
-%setup -q
+%setup -q -a 100 -a 101 -a 102
+patch -p0 < ./nginx_upstream_check_module-master/check_1.9.2+.patch
%build
./configure \
@@ -136,6 +142,9 @@
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
+ --add-module=./lua-nginx-module-0.9.19 \
+ --add-module=./nginx_upstream_check_module-master \
+ --add-module=./ngx_http_consistent_hash-master \
--with-debug \
%{?with_http2:--with-http_v2_module} \
--with-cc-opt="%{optflags} $(pcre-config --cflags)" \
@@ -178,6 +187,9 @@
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
+ --add-module=./lua-nginx-module-0.9.19 \
+ --add-module=./nginx_upstream_check_module-master \
+ --add-module=./ngx_http_consistent_hash-master \
%{?with_http2:--with-http_v2_module} \
--with-cc-opt="%{optflags} $(pcre-config --cflags)" \
$*
我将解释更改的内容。
(Wǒ de .)
-
- luajitを使いたいので BuildRequires: luajit-devel を追加
-
- 使用したいモジュールのソースのURLを Source100, Source101, Source102 に指定
元の nginx.spec に Source0 から Source10 まで書かれているのでnginxの将来のバージョンで Source が増えても衝突しないように100からとしました。
https://github.com/openresty/lua-nginx-module/archive/v0.9.19.tar.gz#/lua-nginx-module-0.9.19.tar.gz のというURLの書き方についてはrpmのspecファイルのSourceにGitHubの任意のコミットのtarballのURLを指定するときの良い書き方 · hnakamur’s blog at githubをご参照ください。
%setupに Source100, Source101, Source102 を展開するためのオプションを追加
オプションについてはSPEC file sections explainedに説明があります。
%setupの後にyaoweibin/nginx_upstream_check_moduleに含まれるパッチcheck_1.9.2+.patchを適用
nginxのconfigureのオプションに使用したいモジュールごとに –add-module=モジュールソースのディレクトリ を追加
在copr上构建和分发rpm。
在上述中,我們使用 copr-build.sh 在 copr 上構建了所述的 srpm。詳細信息可以參考我的 github 部落格 hnakamur’s blog 的「試試使用 Travis CI 和 copr.fedoraproject.org 來構建和發布 rpm」。
RPM构建的安装方式
您可以通过以下命令安装我创建的rpm包,这也在hnakamur/nginx Copr的“安装说明”中有提到。
sudo curl -sL -o /etc/yum.repos.d/hnakamur-nginx.repo https://copr.fedoraproject.org/coprs/hnakamur/nginx/repo/epel-7/hnakamur-nginx-epel-7.repo
sudo yum install nginx
最后
使用Copr,您可以方便地托管自己制作的RPM软件包。我建议大家尝试在Copr上构建和分发各种不同的RPM软件包,这非常方便。