nginx 公式SPRMからRebuildする

# nginx 公式SPRMからRebuildする

## 目的

Apache httpdだとyumでサクッとインストールできるのですが
nginxではモジュールが3rdpartyで完全にオプションのため
nginx公式Yumレポジトリのものにできるだけ近いかたちでカスタムしたRPMを作ることになりました。

## 今回の要件

- LDAP対応
- HTTP/2対応
- SSLライブラリ埋め込み
- 複数サーバへ展開するのと後々バージョンあげるかもしれないのでお手軽にrpm化
- CentOS7向け

LDAPモジュールは、[nginx-auth-ldap](https://github.com/kvspb/nginx-auth-ldap)
HTTP/2の規格に完全対応するためopensslライブラリが一定以上のバージョンが必須です。
しかし、CentOS7の標準レポジトリでは配布されてないバージョンなので組み込みが必須です。

そのようなこともあり、必要なソースパッケージを集めたりするのがいちいち面倒なのでそこはnginx-buildをダウンローダーとして使っています。

rpmbuildはDockerのコンテナ内でやるとさらにお手軽です。

### 注意事項

- pcre
- zlib

以上のパッケージも組み込めるが、特に困ってないのでOSの標準にあるパッケージを使用してコンパイルしています。


## 手順
### 1.必要なものをダウンロード
1. [nginx-build](https://github.com/cubicdaiya/nginx-build)のバイナリをダウンロードしてHOMEディレクトリへ解凍
2. buildしたい`nginx-SRPM`のバージョンを公式からダウンロード`wget http://nginx.org/packages/centos/7/SRPMS/nginx-1.12.1-1.el7.ngx.src.rpm`
3. HOMEディレクトリで`nginx-SRPM`をインストールするとファイルが展開されます`rpm -Uvh {SRPM_PATH}`
4. 必要な依存パッケージ(OS標準のもの)をインストール `sudo yum install pcre-devel.x86_64 zlib-devel.x86_64 openldap-devel.x86_64`
3. nginx-buildで最新版のものを使うものをダウンロードします。`./nginx-build -v 1.12.1 -m module_3rdparty.ini -openssl -clear -configureonly -d work`

```
//module_3rdparty.ini
[nginx-auth-ldap]
form=git
url=https://github.com/kvspb/nginx-auth-ldap
rev=master
```

nginx-buildでダウンロードするとこんなディレクトリになります。

```
$ ls -la work/nginx/1.12.1/
nginx-1.12.1/ nginx-1.12.1.tar.gz nginx-auth-ldap/ nginx-auth-ldap.log openssl-1.0.2n/ openssl-1.0.2n.tar.gz
```

moduleのディレクトリはこんな感じです

```
ls -la work/nginx/1.12.1/nginx-auth-ldap/
total 100
drwxrwxrwx 3 builder builder 113 Apr 16 11:43 .
drwxr-xr-x 5 builder builder 148 Apr 16 11:43 ..
drwxrwxrwx 8 builder builder 152 Apr 16 11:43 .git
-rw-rw-rw- 1 builder builder 1507 Apr 16 11:43 LICENSE
-rw-rw-rw- 1 builder builder 3537 Apr 16 11:43 README.md
-rw-rw-rw- 1 builder builder 672 Apr 16 11:43 config
-rw-rw-rw- 1 builder builder 1590 Apr 16 11:43 example.conf
-rw-rw-rw- 1 builder builder 83529 Apr 16 11:43 ngx_http_auth_ldap_module.c
```

### 2.BUILDの準備
1. `cd work/nginx/1.12.1/`
1. `tar cvzf ~/rpmbuild/SOURCES/nginx-auth-ldap.tar.gz nginx-auth-ldap`
1. `cp openssl-1.0.2l.tar.gz ~/rpmbuild/SOURCES/`

### 3.SPECを編集する
やっていることは

- opensslは同梱させるのでrequireを外す
- module追加するのでそれのオプションを追加
    - `--add-module=nginx-auth-ldap --with-openssl=openssl-1.0.2l --with-openssl-opt='-fPIC'"`
- build時に同梱させるのでそのオプションを追加
    - `Source14: nginx-auth-ldap.tar.gz`
    - `Source15: openssl-1.0.2l.tar.gz`
    - `%setup -a 14 -a 15 -q -n nginx-%{version}`

setupマクロのオプションの意味についてはこちらが参考になりました。
https://vinelinux.org/docs/vine6/making-rpm/setup-macro.html

以上の内容のdiffはこちらになります。

```sh
diff -u nginx.spec rpmbuild/SPECS/nginx.spec
--- nginx.spec 2017-07-11 22:49:34.000000000 +0900
+++ rpmbuild/SPECS/nginx.spec 2017-09-12 18:53:00.060241472 +0900
@@ -12,8 +12,8 @@
Requires(pre): shadow-utils
Requires: initscripts >= 8.36
Requires(post): chkconfig
-Requires: openssl
-BuildRequires: openssl-devel
+#Requires: openssl
+#BuildRequires: openssl-devel
%endif
%if 0%{?rhel} == 6
@@ -21,8 +21,8 @@
Requires(pre): shadow-utils
Requires: initscripts >= 8.36
Requires(post): chkconfig
-Requires: openssl >= 1.0.1
-BuildRequires: openssl-devel >= 1.0.1
+#Requires: openssl >= 1.0.1
+#BuildRequires: openssl-devel >= 1.0.1
%endif
%if 0%{?rhel} == 7
@@ -31,9 +31,9 @@
Epoch: %{epoch}
Requires(pre): shadow-utils
Requires: systemd
-Requires: openssl >= 1.0.1
+#Requires: openssl >= 1.0.1
BuildRequires: systemd
-BuildRequires: openssl-devel >= 1.0.1
+#BuildRequires: openssl-devel >= 1.0.1
%endif
%if 0%{?suse_version} == 1315
@@ -41,7 +41,7 @@
%define nginx_loggroup trusted
Requires(pre): shadow
Requires: systemd
-BuildRequires: libopenssl-devel
+#BuildRequires: libopenssl-devel
BuildRequires: systemd
%endif
@@ -55,7 +55,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 --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 --add-module=nginx-auth-ldap --with-openssl=openssl-1.0.2l --with-openssl-opt='-fPIC'")
Summary: High performance web server
Name: nginx
@@ -78,6 +78,8 @@
Source11: nginx-debug.service
Source12: COPYRIGHT
Source13: nginx.check-reload.sh
+Source14: nginx-auth-ldap.tar.gz
+Source15: openssl-1.0.2l.tar.gz

License: 2-clause BSD-like license

@@ -96,7 +98,7 @@
%endif

%prep
-%setup -q
+%setup -a 14 -a 15 -q -n nginx-%{version}
cp %{SOURCE2} .
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \
-e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init
```
### 4.build実行
1. 実行ユーザはbuildユーザなのでそのユーザに変更してください
1. `cd ~/rpmbuild && rpmbuild -ba --clean SPECS/nginx.spec`
1. エラーがなければ`RPMS/`の中にrpmファイルができあがります