GeoIP2を動的モジュールとしてnginxを導入

当サイトはGeoIP2モジュールを使用していますが、nginxには含まれていないためにバージョンアップのたびに毎回rpmbuildでGeoIP2を動的モジュールとして組み込んだパッケージをビルドしています。
備忘録として記載しておきます。

目次

GeoIP2を動的モジュールとしてnginxを導入

まず、nginx公式サイトからRPMソースをダウンロードします。
以下は2021年6月3日の最新版 1.21.0です。

$ curl -OL http://nginx.org/packages/mainline/centos/8/SRPMS/nginx-1.21.0-1.el8.ngx.src.rpm

ソースパッケージをインストールします。

$ rpm -ivh nginx-1.21.0-1.el8.ngx.src.rpm

次にngx_http_geoip2_moduleをダウンロードします。

バージョンは3.3です。

$ curl -OL https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.3.tar.gz

ダウンロードしたngx_http_geoip2_moduleのソースファイルをrpmbuild内に配置します。

$ tar zxvf 3.3.tar.gz -C rpmbuild/SOURCES

次にコンパイルで要求されるライブラリーをインストールします。

$ yum install gcc libmaxminddb libmaxminddb-devel pcre-devel zlib-devel

SPECファイルを編集します。

以下は差分です。

$ diff -Naru nginx.spec.org nginx.spec
--- nginx.spec.org      2021-05-25 22:09:39.000000000 +0900
+++ nginx.spec  2021-06-03 10:15:44.055789237 +0900
@@ -64,7 +64,7 @@
 %define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
 %define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie

-%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")
+%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  --add-dynamic-module=${RPM_SOURCE_DIR}/ngx_http_geoip2_module-3.3 --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")

 Summary: High performance web server
 Name: nginx
@@ -84,6 +84,7 @@
 Source7: nginx-debug.service
 Source8: nginx.copyright
 Source9: nginx.check-reload.sh
+Source10: ngx_http_geoip2_module-3.3



@@ -217,6 +218,7 @@

 %attr(0755,root,root) %dir %{_libdir}/nginx
 %attr(0755,root,root) %dir %{_libdir}/nginx/modules
+%{_libdir}/nginx/modules/*
 %dir %{_datadir}/nginx
 %dir %{_datadir}/nginx/html
 %{_datadir}/nginx/html/*
追加箇所は3点です。
コンパイルオプションに--add-dynamic-moduleを追加しngx_http_geoip2_moduleのソースファイルのパスを指定しています。
ソースファイルをエントリしています。解凍したものを配置したので不要だと思います。
最後にインストールされるバイナリーのパスチェックがありますのでダイナミックモジュールのインストールパスを追加します。

準備が整ったのでバイナリーをビルドします。

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec

必要なライブラリーなどが表示されたら追加でインストールして再度ビルドを実行してください。

旧バージョンのnginxをアンインストールします。
yum などでその他ダイナミックモジュールをインストールしている場合、パッケージのアップデートやrpm -e だと依存関係でアップデートや削除ができない可能性があります。
次では、一旦、yumを使ってすべてアンインストールしています。

$ yum remove nginx

ビルドした新バージョンのnginxをインストールします。

$ rpm -ivh rpmbuild/RPMS/x86_64/nginx-1.21.0-1.el8.ngx.x86_64.rpm

インストールが完了したら先ほどアンインストールしたダイナミックモジュールなどをインストールします。

$  yum install nginx-module-image-filter nginx-module-njs nginx-module-perl nginx-module-xslt

現在nginxは新しくインストールした状態になっていますので設定を行います。

$ cp /etc/nginx/nginx.conf.rpmsave /etc/nginx/nginx.conf
$ nginx -t
$ systemctl enable nginx
$ systemctl start nginx
既存のnginx.confは.rpmsaveで退避されていますので元に戻します。
nginx.confのチェックをしてエラーがないことを確認します。
サービスが自動的に起動するように設定します。
nginxサービスを起動します
以上で終了です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大阪府門真市に生まれ、高校卒業まで京都府福知山市で育ち、大学は工学部電子工学科を卒業。半導体設計会社に勤務ののちインフラエンジニアとして監視基盤の運用設計業務に就く。現在は都内の施設に勤務。横浜在住。人の役に立てることができればいいなと日々思っています。

目次