Nginx にCache Purgeモジュールを追加する

notoです。

Nginxはリバースプロキシを利用してキャッシュを行う機能がデフォルトで組み込まれていますが、そのキャッシュを削除する機能がありません。

そこで、サードパーティーモジュールのひとつである Cache Purgeモジュールを組み込んでみたいと思います。このモジュールを組み込むことで、キャッシュの削除を行うことができます。

インストール環境

  • CentOS 6.2(64bit)
  • Nginx 1.2.0
  • Cache Purge 1.5.0

Nginxが既にインストールされている場合

NginxはApacheのように動的にモジュールの追加ができないので、もう一度ビルドし直す必要があります。既にNginxがインストールされている場合は、無停止で切り替える方法もあるのですが、まだ稼働もしていないのでアンインストールしちゃいます。

Nginxのアンインストール

1
2
3
[root@www ~]# rpm -q nginx
nginx-1.2.0-1.el6.x86_64
[root@www ~]# rpm -e nginx-1.2.0-1

Cache Purgeモジュールを追加する

rpmbuildしてインストールを行います。

rpmbuild環境の作成

必要なパッケージのインストール

1
yum install rpm-build perl-ExtUtils-Embed

ビルドユーザーの作成

rpmbuildはシステムにダメージを与える可能性があるので、専用のユーザーを作成します。

1
2
3
useradd rpmbuilder
passwd rpmbuilder
[パスワード応答]

sudoの設定

sudoできるよう設定を行います。

1
2
visudo
rpmbuilder ALL=(ALL) ALL ← 追加

ビルド環境の準備

1
2
su rpmbuilder
mkdir -p ~/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

設定ファイルの作成

rpmbuildの際に参照される設定ファイルを新規作成します。

1
echo '%_topdir %(echo $HOME)/rpm' > ~/.rpmmacros

これでrpmbuildの準備が完了です。

src.rpmのダウンロード & インストール

ここからは、全てrpmbuilderで作業を行います。

1
2
3
cd /usr/local/src
wget http://dl.fedoraproject.org/pub/epel/6/SRPMS/nginx-1.0.15-1.el6.src.rpm
sudo rpm -Uvh nginx-1.0.15-1.el6.src.rpm

最新ソースのダウンロード

Nginx と、Nginx Cache Purgeモジュールの最新のソースコードをダウンロードします。

1
2
3
cd ~/rpm/SOURCES/
wget http://nginx.org/download/nginx-1.2.0.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-1.5.tar.gz

specファイルの編集

specファイルの編集を行います。行うことはCache Purgeモジュールを追加することと、必要のないモジュールの無効化です。 specファイルはsrc.rpmをインストールした際に、~/rpm/SPECS 以下に作成されるのでこれを編集していきます。

1
$ vi nginx.spec
nginx.spec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#追加。Cache Purgeモジュールのバージョン定義
%global nginx_cache_purge_version 1.5

#追加 ソースコードの指定、ダウンロードしたファイルと名前が一致するように。
Source8: ngx_cache_purge-%{nginx_cache_purge_version}.tar.gz

#以下はコメントアウト
#Patch0: nginx-auto-cc-gcc.patch
#%patch0 -p0

#追加 cache purgeのソースコードの展開
%setup -T -D -a 8

#configure オプション
./configure \
--prefix=%{nginx_datadir} \
--sbin-path=%{_sbindir}/nginx \
--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-http_stub_status_module \
--with-http_perl_module \
--with-http_gzip_static_module \
--without-http_autoindex_module \
--without-http_geo_module \
--without-http_map_module \
--without-http_referer_module \
--without-http_limit_conn_module \
--without-http_limit_req_module \
--without-http_browser_module \
--add-module=%{_builddir}/nginx-%{version}/ngx_cache_purge-%{nginx_cache_purge_version}

最初は without-http_limit_zone_moduleを指定していたのですが、ビルドを行ったら以下のエラーが出力されたので、without-http_limit_conn_moduleに変更しました。

1
2
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other "--without-http_limit_zone_module" option is deprecated, use the "--without-http_limit_conn_module" option instead

ビルド & インストール

1
2
3
4
rpmbuild -ba nginx.spec

cd ~/rpm/RPMS/x86_64
sudo rpm -Uvh nginx-1.2.0-1.el6.x86_64.rpm

確認

ngx_cache_purgeが組み込まれているか確認します。

1
2
nginx -V
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --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-http_stub_status_module --with-http_perl_module --with-http_gzip_static_module --without-http_autoindex_module --without-http_geo_module --without-http_map_module --without-http_referer_module --without-http_limit_conn_module --without-http_limit_req_module --without-http_browser_module --add-module=/home/mars/rpm/BUILD/nginx-1.2.0/ngx_cache_purge-1.5

参考

apache のかわりにnginxを使ってみる(1)-3 リバースプロキシのキャッシュ削除モジュール nginx cache purge を組み込む

Comments