ngx_pagespeed対応版nginxパッケージの作成(RHEL系)

公開日: : 最終更新日:2014/10/07 サーバ ,

インストールされているミドルウェアやアプリケーションはパッケージ化されていると、管理上において非常に楽なので利用しているものは全てパッケージ化するようにしている。
RHEL系のOSを扱うことが多いので、今回はngx_pagespeedに対応したnginxパッケージを作成する方法を記載しておく。

作業ディレクトリの作成

作業用のディレクトリを以下のような構成で作成する。

[~/rpmbuild]
 ├ [SPECS]   .specファイル
 └ [SOURCES] ソースやパッチ

他にも必要なディレクトリはあるが、必要に応じて作ってくれるので最低限上記のディレクトリを以下のようにして作成する。

$ cd ~ && mkdir -p ~/rpmbuild/{SOURCES,SPECS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

パッケージ作成コマンド類のインストール

今回はRHEL系なのでrpmbuildやらのコマンドが必要。
もちろん、Development toolsも一式インストールしておく必要がある。
これらを全てインストールするには以下のようにする。

$ sudo yum groupinstall "Development tools" -y
$ sudo yum install rpm-build -y

ソースファイルの準備

最新のNginxのSourceをサイトから確認し(以下URL)、準備したSOURCESディレクトリにダウンロードする。
nginx: download
作業時点(2014-08-21)では1.6.1が最新だったので、これを以下のようにしてダウンロードする。

$ cd ~/rpmbuild/SOURCES
$ wget http://nginx.org/download/nginx-1.6.1.tar.gz

次にngx_pagespeedのSourceも必要になるが、これは少し準備が必要。
公式にある手順を参考にしつつ最新Sourceを準備する。
Build ngx_pagespeed From Source – PageSpeed Module — Google Developers
上記手順では、zipパッケージをダウンロードしているようだが、面倒なので最新をgitで取得することにする。
まずはwork用のディレクトリを準備し、そこに最新ソースをgitでcloneする。

$ mkdir -p ~/work
$ cd ~/work && git clone https://github.com/pagespeed/ngx_pagespeed.git
$ rm -fr ngx_pagespeed/.git*

次に、cloneしたディレクトリ配下にて必要なライブラリ類をダウンロードし展開する。
このあたりは公式手順を参考に。。。(作業時点での最新バージョンは1.8.31.4)

$ cd ngx_pagespeed
$ NPS_VERSION=1.8.31.4
$ wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
$ tar -zxf ${NPS_VERSION}.tar.gz
$ rm -fr ${NPS_VERSION}.tar.gz

ここまででngx_pagespeedの必要なものが準備出来たので、これをアーカイブしてSOURCEディレクトリに配置する。

$ cd ~/work
$ tar -zcf ~/rpmbuild/SOURCES/ngx_pagespeed-%{NPS_VERSION}.tar.gz ./ngx_pagespeed

今後も作業する可能性があるので、ディスク容量には十分に余裕がるので作業ディレクトリはそのまま放置しておくことにした。

SPECファイルの準備

どこからか拾ってきて編集するのが一番簡単。
もしくは、例えばEC2でAmazon Linuxを利用している場合は、以下のようにしてsrpmパッケージから利用することができる。

$ get_reference_source -p nginx

上記のようにして、インストール済みのパッケージのSource RPMがダウンロードできる。
yumdownloaderを使うなら、以下のように。

$ yumdownloader --source nginx

今回は、nginxのサイトからRHEL6用のソースパッケージをインストールして、以下の様なSPECファイルにしてみた。
パッケージのインストールはこんな感じ。

$ rpm -ivh http://nginx.org/packages/rhel/6/SRPMS/nginx-1.6.1-1.el6.ngx.src.rpm

SPECファイルはこんな感じで、~/rpmbuild/SPEC/nginx.specとして保存している。

%global  nginx_user          nginx
%global  nginx_group         nginx
%global  nginx_home          %{_localstatedir}/lib/nginx
%global  nginx_home_tmp      %{nginx_home}/tmp
%global  nginx_confdir       %{_sysconfdir}/nginx
%global  nginx_datadir       %{_datadir}/nginx
%global  nginx_logdir        %{_localstatedir}/log/nginx
%global  nginx_webroot       %{nginx_datadir}/html
%global  ngx_pagespeed_ver   1.8.31.4

Name:              nginx
Epoch:             1
Version:           1.6.1
Release:           1%{?dist}
Summary:           A high performance web server and reverse proxy server
Group:             System Environment/Daemons
License:           BSD
URL:               http://nginx.org/
Source0:           http://nginx.org/download/%{name}-%{version}.tar.gz
Source1:           https://github.com/pagespeed/ngx_pagespeed/archive/ngx_pagespeed-%{ngx_pagespeed_ver}.tar.gz
Source10:          nginx.service
Source11:          logrotate
Source12:          nginx.conf
Source15:          nginx.init
Source16:          nginx.sysconf

BuildRequires:     GeoIP-devel
BuildRequires:     gd-devel
BuildRequires:     libxslt-devel
BuildRequires:     openssl-devel
BuildRequires:     pcre-devel
BuildRequires:     perl-devel
BuildRequires:     perl(ExtUtils::Embed)
BuildRequires:     zlib-devel
Requires:          GeoIP
Requires:          gd
Requires:          openssl
Requires:          pcre
Requires:          perl(:MODULE_COMPAT_%(eval &quot;<code>%{__perl} -V:version</code>&quot;; echo $version))
Requires(pre):     shadow-utils
Provides:          webserver

Requires(post):    chkconfig
Requires(preun):   chkconfig, initscripts
Requires(postun):  initscripts

%description
Nginx 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.

%prep
%setup -q -a 1
%patch0 -p0

%build
export DESTDIR=%{buildroot}
./configure \
    --prefix=%{_prefix} \
    --conf-path=%{nginx_confdir}/nginx.conf \
    --error-log-path=%{nginx_logdir}/error.log \
    --http-log-path=%{nginx_logdir}/access.log \
    --http-client-body-temp-path=%{nginx_home_tmp}/client_body \
    --http-proxy-temp-path=%{nginx_home_tmp}/proxy \
    --http-fastcgi-temp-path=%{nginx_home_tmp}/fastcgi \
    --http-uwsgi-temp-path=%{nginx_home_tmp}/uwsgi \
    --http-scgi-temp-path=%{nginx_home_tmp}/scgi \
    --pid-path=%{_localstatedir}/run/nginx.pid \
    --lock-path=%{_localstatedir}/lock/subsys/nginx \
    --user=%{nginx_user} \
    --group=%{nginx_group} \
    --with-file-aio \
    --with-http_ssl_module \
    --with-http_spdy_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_xslt_module \
    --with-http_image_filter_module \
    --with-http_geoip_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_auth_request_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_degradation_module \
    --with-http_stub_status_module \
    --with-http_perl_module \
    --add-module=ngx_pagespeed \
    --with-pcre \
    --with-debug \
    --with-cc-opt=&quot;%{optflags} $(pcre-config --cflags)&quot; \
    --with-ld-opt=&quot;$RPM_LD_FLAGS -Wl,-E&quot; # so the perl module finds its symbols

make %{?_smp_mflags}

%install
make install DESTDIR=%{buildroot} 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 '{}' \;
install -p -D -m 0755 %{SOURCE15} \
    %{buildroot}%{_initddir}/nginx
install -p -D -m 0644 %{SOURCE16} \
    %{buildroot}%{_sysconfdir}/sysconfig/nginx

install -p -D -m 0644 %{SOURCE11} \
    %{buildroot}%{_sysconfdir}/logrotate.d/nginx

install -p -d -m 0755 %{buildroot}%{nginx_confdir}/conf.d
install -p -d -m 0700 %{buildroot}%{nginx_home}
install -p -d -m 0700 %{buildroot}%{nginx_home_tmp}
install -p -d -m 0700 %{buildroot}%{nginx_logdir}
install -p -d -m 0755 %{buildroot}%{nginx_webroot}

install -p -m 0644 %{SOURCE12} \
    %{buildroot}%{nginx_confdir}
rm -fr %{buildroot}%{_prefix}/html

install -p -D -m 0644 %{_builddir}/nginx-%{version}/man/nginx.8 \
    %{buildroot}%{_mandir}/man8/nginx.8

%pre
getent group %{nginx_group} &gt; /dev/null || groupadd -r %{nginx_group}
getent passwd %{nginx_user} &gt; /dev/null || \
    useradd -r -d %{nginx_home} -g %{nginx_group} \
    -s /sbin/nologin -c &quot;Nginx web server&quot; %{nginx_user}
exit 0

%post
if [ $1 -eq 1 ]; then
    /sbin/chkconfig --add %{name}
fi
if [ $1 -eq 2 ]; then
    # Make sure these directories are not world readable.
    chmod 770 %{nginx_home}
    chmod 770 %{nginx_home_tmp}
    chmod 770 %{nginx_logdir}
fi

%preun
if [ $1 -eq 0 ]; then
    /sbin/service %{name} stop &gt;/dev/null 2&gt;&amp;1
    /sbin/chkconfig --del %{name}
fi

%postun
if [ $1 -eq 2 ]; then
    /sbin/service %{name} upgrade || :
fi

%files
%doc LICENSE CHANGES README
%{_initddir}/nginx
%config(noreplace) %{_sysconfdir}/sysconfig/nginx
%{nginx_datadir}/
%{_sbindir}/nginx
%{_mandir}/man3/nginx.3pm*
%{_mandir}/man8/nginx.8*
%dir %{nginx_confdir}
%dir %{nginx_confdir}/conf.d
%config(noreplace) %{nginx_confdir}/fastcgi.conf
%config(noreplace) %{nginx_confdir}/fastcgi.conf.default
%config(noreplace) %{nginx_confdir}/fastcgi_params
%config(noreplace) %{nginx_confdir}/fastcgi_params.default
%config(noreplace) %{nginx_confdir}/koi-utf
%config(noreplace) %{nginx_confdir}/koi-win
%config(noreplace) %{nginx_confdir}/mime.types
%config(noreplace) %{nginx_confdir}/mime.types.default
%config(noreplace) %{nginx_confdir}/nginx.conf
%config(noreplace) %{nginx_confdir}/nginx.conf.default
%config(noreplace) %{nginx_confdir}/scgi_params
%config(noreplace) %{nginx_confdir}/scgi_params.default
%config(noreplace) %{nginx_confdir}/uwsgi_params
%config(noreplace) %{nginx_confdir}/uwsgi_params.default
%config(noreplace) %{nginx_confdir}/win-utf
%config(noreplace) %{nginx_confdir}/conf.d/virtual.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx
%dir %{perl_vendorarch}/auto/nginx
%{perl_vendorarch}/nginx.pm
%{perl_vendorarch}/auto/nginx/nginx.so
%attr(700,%{nginx_user},%{nginx_group}) %dir %{nginx_home}
%attr(700,%{nginx_user},%{nginx_group}) %dir %{nginx_home_tmp}
%attr(700,%{nginx_user},%{nginx_group}) %dir %{nginx_logdir}

%changelog
* Wed Aug 21 2014 xxxxxxxxxxx &lt;hoge@fuga.com&gt; - 1.6.1-1
- update new version 1.6.1.

上記のSPECファイルでの肝は、

%setup -q -a 1

と、「-a 1」追加してnginxのSourceを展開した後、そのディレクトリに移動後にSource1で指定したngx_pagespeedのSourceの展開している点。
それと、configureで、

    --add-module=ngx_pagespeed \

として、相対パスでngx_pagespeedのSourceディレクトリを指定している点。
後は適当にバージョン等々を変更してある。

パッケージのBuild

上記まで準備出来たら、後はrpmbuildコマンドでSPECファイルを指定してパッケージ化する。

$ rpmbuild -ba ~/rpmbuild/SPEC/nginx.spec
<中略>
書き込み完了: /home/xxxx/rpmbuild/SRPMS/nginx-1.6.1-1.xxxxx.src.rpm
書き込み完了: /home/xxxx/rpmbuild/RPMS/x86_64/nginx-1.6.1-1.xxxxx.x86_64.rpm
書き込み完了: /home/xxxx/rpmbuild/RPMS/x86_64/nginx-debuginfo-1.6.1-1.xxxxx.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.7NDs0a
+ umask 022
+ cd /home/xxxx/rpmbuild/BUILD
+ cd nginx-1.6.1
+ /bin/rm -rf /home/xxxx/rpmbuild/BUILDROOT/nginx-1.6.1-1.amzn1.x86_64
+ exit 0

上記ではdebuginfoのパッケージまで作っているが、nginx-1.6.1-1.xxxxx.x86_64.rpm(xxxxxは伏せ字)をインストールすればOK!

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

rpmコマンドでインストールする。

rpm -ivh /home/xxxx/rpmbuild/RPMS/x86_64/nginx-1.6.1-1.xxxxx.x86_64.rpm

すでにパッケージをインストールしてある場合は、オプションを「-Uvh」とかでインストールする。

インストール後の確認

インストールしたnginxバイナリを以下のようにオプション付きで確認すると、configureオプションを表示してくれるので、それで確認する。

$ <code>which nginx</code> -V
nginx version: nginx/1.6.1
built by gcc 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-http_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --add-module=ngx_pagespeed --with-pcre --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=' -Wl,-E'

これで幸せになれるはず!!

Adレクタングル[忍者ADMAX]

関連記事

nginx_logo

NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を想定して書いている。 ngin

記事を読む

aws_logo._V400518270_

AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がVPC内でのPrivate Ho

記事を読む

RabbitMQ.sh-600x600

EC2上のRabbitMQをMulti-AZで冗長化

うーん。。。ハマった。 多分、もっとErlangのこと把握できていればよかったのだろうけど。

記事を読む

no image

dstat+td-agent+ElasticSearch+Graphite+Grafana on Amazon Linux

タイトルが異様に長いけど、業務でタイトルのようなパフォーマンス監視環境を作った。 難易度はそんなに

記事を読む

nginx_logo

NginxでのOCSP Stapling対応設定

意外にハマったのでメモ。 OCSPとは OCSP(Online Certificate Stat

記事を読む

コメントを残す

Adレクタングル[忍者ADMAX]

RabbitMQ.sh-600x600
EC2上のRabbitMQをMulti-AZで冗長化

うーん。。。ハマった。 多分、もっとErlangのこと把握できていれ

aws_logo._V400518270_
AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がV

nginx_logo
NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を

→もっと見る

  • Author:
    hiro
    Work:
    インフラエンジニア
    Brief History:
    新卒後、ソフトハウスにて受託開発を中心に開発エンジニアを始める。
    数年前から現在はITインフラが専門。
PAGE TOP ↑