Amazon Linux 2でNginxを自分でビルドしてngx_cache_purgeモジュールやecho-nginx-moduleなどを使えるようにする

ngx_cache_purgeモジュールが必要でNginxをソースコードからビルドしたのでメモしておきます。以下順番にrootユーザーで実行しています。

ビルド準備

コンパイラなどを入れます。*-develはmoduleを追加しなければ入れなくてokです。

yum install -y gcc gcc-c++ libxslt-devel gd-devel GeoIP-devel

ビルド時に必要なライブラリ類のダウンロード

PCRE

PCRE - Perl Compatible Regular ExpressionsダウンロードリンクからPCRE(PCRE2ではない)をダウンロードして解凍します。

cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxvf pcre-8.43.tar.gz
rm pcre-8.43.tar.gz
cd pcre-8.43

OpenSSL

OpenSSLのダウンロードページから最新版をダウンロードして解凍します。

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -zxvf openssl-1.1.1d.tar.gz
rm openssl-1.1.1d.tar.gz

zlib

zlib Home Siteから最新版をダウンロードして解凍します。

cd /usr/local/src
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
rm zlib-1.2.11.tar.gz

ngx_cache_purge

GitHubのリリースページから最新版を確認してダウンロードして解凍します。

cd /usr/local/src
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -zxvf 2.3.tar.gz
rm 2.3.tar.gz

echo-nginx-module

GitHubのリリースページから最新の正式版をダウンロードして解凍します。

cd /usr/local/src
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar -zxvf v0.61.tar.gz
rm v0.62rc1.tar.gz

Nginx

Nginxのダウンロードページから最新版をダウンロードして解答します。

cd /usr/local/src
wget https://nginx.org/download/nginx-1.17.8.tar.gz
tar -zxvf nginx-1.17.8.tar.gz
rm nginx-1.17.8.tar.gz

configure

ダウンロードが終わったらNginxのディレクトリに入ってMakefileを作成します。

cd nginx-1.17.8

今回は以下ののようなオプションを設定しました。オプションについてはBuilding nginx from Sourcesに詳しくあります。

./configure --prefix=/etc/nginx \
	--sbin-path=/usr/sbin/nginx \
	--conf-path=/etc/nginx/nginx.conf \
	--modules-path=/usr/lib64/nginx/modules \
	--error-log-path=/var/log/nginx/error.log \
	--http-log-path=/var/log/nginx/access.log \
	--pid-path=/var/run/nginx.pid \
	--lock-path=/var/run/nginx.lock \
	--user=nginx \
	--group=nginx \
	--http-client-body-temp-path=/var/cache/nginx/client_temp \
	--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
	--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
	--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
	--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
	--with-pcre-jit \
	--with-http_addition_module \
	--with-http_dav_module \
	--with-http_gzip_static_module \
	--with-http_realip_module \
	--with-http_stub_status_module \
	--with-http_ssl_module \
	--with-http_image_filter_module=dynamic \
	--with-http_geoip_module=dynamic \
	--with-http_flv_module \
	--with-http_mp4_module \
	--with-stream_ssl_preread_module \
	--with-http_sub_module \
	--with-http_xslt_module \
	--with-mail \
	--with-mail_ssl_module \
	--with-openssl=/usr/local/src/openssl-1.1.1d \
	--with-pcre=/usr/local/src/pcre-8.43 \
	--add-module=/usr/local/src/ngx_cache_purge-2.3 \
	--add-module=/usr/local/src/echo-nginx-module-0.61

ビルドとインストール

インストール前にnginxユーザーの作成とchacheディレクトリの作成をしておきます。

useradd -M nginx
mkdir -p /var/cache/nginx
mkdir /var/cache/nginx/client_temp
mkdir /var/cache/nginx/proxy_temp
mkdir /var/cache/nginx/fastcgi_temp
mkdir /var/cache/nginx/uwsgi_temp
mkdir /var/cache/nginx/scgi_temp

ビルドしてインストールします。

make
make install

成功すれば--sbin-pathで指定したディレクトリにnginxの実行ファイルが出来上がっているはずです。

サービスに登録

これだけだとsystemdのサービスに登録されていないので/usr/lib/systemd/system/nginx.serviceというファイルを下記内容で作成します。

実行ファイルの場所やPIDの場所などを変更した場合は設定も変更する必要があります。また、Restart=alwaysにしてプロセスの監視もするように設定しています。

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
Restart=always

[Install]
WantedBy=multi-user.target

このファイルを設定後systemctl daemon-reloadでsystemdを再読み込みします。

自動起動設定

最後に自動起動設定をしてnginxを立ち上げれば完了です!

systemctl enable nginx.service
systemctl start nginx.service