概要
古めの大量のCentOSにyum一発で入らない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は違えどこの辺を参考に書いていく。
続いて、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 OpenSSL
が1.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:(省略)
まとめ
パッケージをカスタマイズしたいときや、いち早く最新バージョンのソフトウェアを利用したい場合とかがソースビルドを行う理由かなって思ってたんですけど古いサーバに自前でバイナリを用意する場合も使えたりするんですねっていう発見。
あんまやりたくないけど。