地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

nginxのパッケージを作ってみる

概要

古めの大量のCentOSyum一発で入らないnginxを入れるためのRPMパッケージ作成のメモ

環境

CentOS 6系

CentOS7.1 64bit rpmbuildコマンドによるRPMの作成 | kakiro-web カキローウェブ

RPMの作成はこの辺を参考に行う。

追加パッケージのインストール

# yum groupinstall "Development Tools"
# yum install pcre-devel openssl-devel libxslt-devel gd-devel perl-ExtUtils-Embed epel-release

RPMパッケージを作るための準備

rpmdevtoolsをインストールし、ビルド専用ユーザ builder を作成し su する。

$ sudo yum install rpmdevtools yum-utils
$ useradd builder
$ su - builder
$ cd
$ rpmdev-setuptree 
$ ls -al rpmbuild

ソースの準備

Nginxの公式から持ってくる。OpenSSLも自前で用意するならこのタイミングで用意する(不要ならSSLの方だけスキップ)

http://nginx.org/packages/mainline/centos/6/SRPMS/nginx-1.15.9-1.el6.ngx.src.rpm

https://www.openssl.org/source/openssl-1.0.2r.tar.gz

$ wget http://nginx.org/packages/mainline/centos/6/SRPMS/nginx-1.15.9-1.el6.ngx.src.rpm
$ wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz

展開

$ rpm -ivh ./nginx-1.15.9-1.el6.ngx.src.rpm
$ tar zxvf ./openssl-1.0.2r.tar.gz

SPECファイルの編集

既にOSに入っているOpenSSL1.0.1を使用しないため、該当箇所をコメントアウトする。 さらに、configureオプションでOpenSSL1.0.2rの場所を指定することで、静的にリンクしてビルドする。

$ vim ./rpmbuild/SPECS/nginx.spec 

この辺はググったら出てきたけどエラーが出たら以下のように修正すると良いらしい。6.10では再現したので対応。

%if 0%{?rhel} == 6
%define _group System Environment/Daemons
Requires(pre): shadow-utils
Requires: initscripts >= 8.36
Requires(post): chkconfig
#Requires: openssl >= 1.0.1 ★
#BuildRequires: openssl-devel >= 1.0.1 ★
%endif

OSは違えどこの辺を参考に書いていく。

4thsight.xyz

続いて、58行目付近にconfigureオプションの記載があるので、行末に以下のOpenSSL1.0.2のパスとオプションを追加する。 --with-openssl=/home/builder/openssl-1.0.2r --with-openssl-opt=-fPIC OpenSSLの展開後パスは適宜指定。

(./rpmbuild/SPECS/nginx.spec)58行目付近
%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_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-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-openssl=/home/builder/openssl-1.0.2r --with-openssl-opt=-fPIC")

コンパイル & パッケージのビルド

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec -D 'debug_package %{nil}'

ビルドの確認

無事にビルドが終わったらパッケージを確認する。

$ ls -al ./rpmbuild/RPMS/x86_64/

nginxインストールと確認

インストールはrootに戻ってyumで。rpm -ivhとかでもいい。

# yum install /home/builder/rpmbuild/RPMS/x86_64/nginx-1.15.9-1.el6.ngx.x86_64.rpm

built with OpenSSL1.0.2rになっていることを確認する。

# nginx -V
nginx version: nginx/1.15.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC) 
built with OpenSSL 1.0.2r  26 Feb 2019
TLS SNI support enabled
configure arguments:(省略)

まとめ

パッケージをカスタマイズしたいときや、いち早く最新バージョンのソフトウェアを利用したい場合とかがソースビルドを行う理由かなって思ってたんですけど古いサーバに自前でバイナリを用意する場合も使えたりするんですねっていう発見。

あんまやりたくないけど。