ldap認証対応のnginxのrpmを作成してみる

# 概要
nginxのrpmでldap認証に対応しているものが、見つからないので、自分でldap対応モジュールを組み込んで、sourceよりビルドしていく、[前の記事で構築したサーバー](http://qiita.com/hirotaka-tajiri/items/c89725cffd0edb046aaa) にitamaeで適用するので、rpmとリポジトリ作成する

# 前準備

## 必要なソースコードの取得
nginxオフィシャルより Mainline version の 
[nginx-1.11.3.tar.gz](https://nginx.org/download/nginx-1.11.3.tar.gz)
[nginx-1.11.3.tar.gz.asc](https://nginx.org/download/nginx-1.11.3.tar.gz.asc)
と、
nginx-auth-ldap の [gitリポジトリ](https://github.com/kvspb/nginx-auth-ldap.git)のクローンをする

---

**ビルド用サーバーで一連の作業を行う**
*また、特別な指示が無い限りは、ビルド作業は一般ユーザーアカウントで行い、rootでは行わないことなぜならば、途中の作業で失敗した時に、システムに実際の追加などが行われないということを確保するため*

- (rootユーザーで)ビルドに必要なパッケージをまとめて追加する

```shell-session
# rootユーザーでビルド用の開発ツールグループをまとめて追加する
sudo yum groupinstall "Development Tools"
sudo yum install createrepo
```

- (rootユーザーで)ソースコード保存ディレクトリ[rpm_src]を作成し、(ビルドユーザーで)必要なソースコードを集める

```shell-session

# rootユーザーで元ディレクトリを作成し、パーミッションを766に変更
sudo mkdir /usr/local/src/rpm_src
sudo chmod 766 /usr/local/src/rpm_src
cd /usr/local/src/rpm_src

# ビルドユーザーで各パッケージ用のサブディレクトリを作成し、ソースコードを集める
mkdir nginx
cd nginx
wget  https://nginx.org/download/nginx-1.11.3.tar.gz
wget　https://nginx.org/download/nginx-1.11.3.tar.gz.asc
git  clone https://github.com/kvspb/nginx-auth-ldap.git
```

- nginxのソースコードに関して、改竄チェックを行う

```shell-session
sudo gpg --verify nginx-1.11.3.tar.gz.asc 

#=> gpg: 2016年07月26日 22時59分49秒 JSTにRSA鍵ID A1C052F8で施された署名
#=> gpg: "Maxim Dounin <mdounin@mdounin.ru>"からの正しい署名
#=> gpg: *警告*: この鍵は信用できる署名で証明されていません!
#=> gpg:       この署名が所有者のものかどうかの検証手段がありません。
#=> 主鍵のフィンガー・プリント: B0F4 2533 73F8 F6F5 10D4  2178 520A #=> 9993 A1C0 52F8
```

署名者がnginxのオフィシャルサイトにある、Maxim Dounin氏なので問題なし、gitのリポジトリに関しては、gitなので問題なしとする

- 今後の作業のためにnginx-auth-ldapのソースコードは、tar.gzファイルにまとめる

```shell-session
tar -zcf nginx-auth-ldap.tar.gz nginx-auth-ldap
```

- tar.gz にまとめたソースコードを使いコンパイルが通るかチェックする、コンパイルオプションはnginxのオフィシャルサイトのMain lineの[Configure Arguments](https://nginx.org/en/linux_packages.html#mainline)にする


```shell-session
# ビルドのチェックは /tmp で行う
tar -zxf nginx-1.11.3.tar.gz -C /tmp
tar -zxf nginx-auth-ldap.tar.gz -C /tmp/nginx-1.11.3/

# ソースコードを展開したディレクトに移動し、configureする
cd /tmp/nginx-1.11.3

LDFLAGS="-L/usr/lib64" \
"./configure" \
"--prefix=/etc/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" \
"--pid-path=/var/run/nginx.pid" \
"--lock-path=/var/run/nginx.lock" \
"--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" \
"--user=nginx" \
"--group=nginx" \
"--with-http_ssl_module" \
"--with-http_realip_module" \
"--with-http_addition_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_random_index_module" \
"--with-http_secure_link_module" \
"--with-http_stub_status_module" \
"--with-http_auth_request_module" \
"--with-threads" \
"--with-stream" \
"--with-stream_ssl_module" \
"--with-http_slice_module" \
"--with-mail" \
"--with-mail_ssl_module" \
"--with-file-aio" \
"--with-http_v2_module" \
"--with-ipv6" \
"--add-module=nginx-auth-ldap"

# configure が通れば、makeまですすめる
make
```

Main lineのConfigure Argumentsに加え、明確に64bitコンパイルにするために、LDFLAGS="-L/usr/lib64" とldap対応のために、--add-module=nginx-auth-ldap を追加する

# rpm作成の本作業

- rpmビルドユーザーのホームディレクトリに、rpm化作業用のディレクトリを作成する

```shell-session
cd
mkdir rpmbuild
cd rpmbuild
mkdir BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
```
- ソースコードからのインストールファイル以外をrpmに含める場合には、そのファイルを準備する
   
   本件では、ソースからのインストールではインストールされない、ログローテート用のファイル(nginx)と、systemctl用のファイル(nginx.service) をrpm化するソース類と同じディレクトリに作成する
  (本件だと /usr/local/src/rpm_src/nginx 内に作成)

 ```sh:nginx
/var/log/nginx/*log {
    create 0644 nginx nginx
    daily
    rotate 5
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/nginx.pid` 2>/dev/null
    endscript
}
 ```
 ```sh:nginx.service
[Unit]
Description=The nginx HTTP server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
KillSignal=SIGQUIT
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target
 ```
  

- rpm作成のために、specファイルを作成する

rpm化するソース類と同じディレクトリに作成するとよい
(本件だと /usr/local/src/rpm_src/nginx 内に作成)
また、本件ではnginxのパッケージを作成するが、自分で作成したnginxのパッケージと、他が作成したnginxとを区別するために、nginx_myrpmとして作成することにする

```spec:nginx_myrpm.spec
Summary: Nginx webserver (with ssl, ldap-auth)
Name: nginx_myrpm
Version: 1.11.3
Release: 1.el7
License: BSD-like
Group: Web-server-environment
Source0: nginx-1.11.3.tar.gz
Source1: nginx-auth-ldap.tar.gz
Source2: nginx
Source3: nginx.service
BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
BuildRequires: openldap-devel,openssl-devel,zlib-devel,pcre-devel
Requires: openldap,openssl,zlib,pcre
Conflicts: nginx

%description
nginx webserver with ssl, ldap-auth

%prep
[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;

%setup -a 1 -q -n nginx-%{version}

%build
[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;
LDFLAGS="-L/usr/lib64" \
"./configure" \
"--prefix=/etc/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" \
"--pid-path=/var/run/nginx.pid" \
"--lock-path=/var/run/nginx.lock" \
"--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" \
"--user=nginx" \
"--group=nginx" \
"--with-http_ssl_module" \
"--with-http_realip_module" \
"--with-http_addition_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_random_index_module" \
"--with-http_secure_link_module" \
"--with-http_stub_status_module" \
"--with-http_auth_request_module" \
"--with-threads" \
"--with-stream" \
"--with-stream_ssl_module" \
"--with-http_slice_module" \
"--with-mail" \
"--with-mail_ssl_module" \
"--with-file-aio" \
"--with-http_v2_module" \
"--with-ipv6" \
"--add-module=nginx-auth-ldap"
make

%install
[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;
make install DESTDIR=${RPM_BUILD_ROOT}
mkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.d/
mkdir -p ${RPM_BUILD_ROOT}/usr/lib/systemd/system/
mkdir -p ${RPM_BUILD_ROOT}/var/lib/nginx/tmp
mkdir -p ${RPM_BUILD_ROOT}/var/log/nginx
mkdir -p ${RPM_BUILD_ROOT}/var/cache/nginx
install -m 644 %{SOURCE2} ${RPM_BUILD_ROOT}/etc/logrotate.d/
install -m 755 %{SOURCE3} ${RPM_BUILD_ROOT}/usr/lib/systemd/system/

%clean
[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;

%pre
groupadd nginx
useradd nginx -g nginx -s /sbin/nologin -d /etc/nginx -c "Nginx web server"

%postun
userdel nginx -rf

%files
%defattr(644,nginx,nginx)
   /etc/logrotate.d/nginx
   /etc/nginx/fastcgi.conf
   /etc/nginx/fastcgi.conf.default
   /etc/nginx/fastcgi_params
   /etc/nginx/fastcgi_params.default
   /etc/nginx/html/50x.html
   /etc/nginx/html/index.html
   /etc/nginx/koi-utf
   /etc/nginx/koi-win
   /etc/nginx/mime.types
   /etc/nginx/mime.types.default
   /etc/nginx/nginx.conf
   /etc/nginx/nginx.conf.default
   /etc/nginx/scgi_params
   /etc/nginx/scgi_params.default
   /etc/nginx/uwsgi_params
   /etc/nginx/uwsgi_params.default
   /etc/nginx/win-utf
   /var/lib/nginx
   /var/lib/nginx/tmp
   /var/log/nginx
   /var/cache/nginx/
%defattr(755,nginx,nginx)
   /usr/lib/systemd/system/nginx.service
   /usr/sbin/nginx

%changelog
* Thu Sep 8 2016 Hirotaka Tajiri <ganryu_koziro@excite.co.jp> 1-11-3.1
- first build

```

◇specファイルの中身の説明 
 ▼ 冒頭部分(環境変数など)

| 項目 | 内容 |
|:--------:|:-------------|
| Summary: | rpmの概要説明   |
| Name:    | rpmパッケージ名 |
| Version: | rpmのベースになるソースコードのバージョン |
| Release: | rpmのリリース番号 | 
| License: | rpmのライセンス | 
| Group: | rpmのグループ(yum groupinstall時に必要) | 
| Source(n): | rpm化作業で使用するファイル | 
| BuildRoot: | 作業場所 %{_tmppath}/%{name}-%{version}-buildroot でOK |
| BuildRequires: | rpm化作業時に必要になる依存パッケージ | 
| Requires: | 作成したrpmのインストール時に同時にインストールされる依存パッケージ | 
| Conflicts: | 同時にインストールできない共存不可パッケージ | 
 
 ▼ 本体部分

  ▽ %description
  
    パッケージの内容説明

  ▽ %prep

    本作業前に実行される、予備作業。本件では $RPM_BUILD_ROOT の初期化を行う

  ▽ %setup 

    ソースコードの展開をおこなう
    意味としては、 
    %setup -q で 
    SOURCE0 を ~/rpmbuild/BUILD へ展開し、
    cd ~/rpmbuild/BUILD/[Name]-[VERSION] する
    (-q は展開がサイレントモードという意味)
    本件では、
    %setup -a 1 -q -n nginx-%{version} で
    SOURCE0 を ~/rpmbuild/BUILD へサイレントモードで展開し　
    -a 1 で SOURCE1 を展開後の中にサブディレクトリで展開し 
    -n で cdするディレクトリ名を　~/rpmbuild/BUILD/[Name]-[VERSION]
    ではなく、~/rpmbuild/BUILD/nginx-[VERSION] にすると指定している

  ▽ %build
 
    configure から make までのやり方を記載する

  ▽ %install

    rpm化するファイルの配置
    通常とおりmake installでインストールすると
    configureで指定したインストール先に直接インストールされ、
    rpmファイル作業場所 \${RPM_BUILD_ROOT} に配置されない
    そのため、make install DESTDIR=\${RPM_BUILD_ROOT} 
    と指定して、\${RPM_BUILD_ROOT}以下にインストールする
    また、make installでなく、直接ファイルやディレクトリを配置する場合には
    mkdir -p \${RPM_BUILD_ROOT}/etc/logrotate.d/ や
    install -m 644 %{SOURCE2} \${RPM_BUILD_ROOT}/etc/logrotate.d/
    で配置する

  ▽ %clean

    rpm化作業後処理を記載する

  ▽ %pre
  
    作成したrpmファイルをインストールする際の、インストール前作業を記載する
    本件では、nginx用のユーザーアカウント作成を記載している

  ▽ %postun

    作成したrpmファイルをアンインストールする際の後処理を記載する
    本件では、nginx用のユーザーアカウント削除を記載している

  ▽ %files　%defattr

    rpm化配置ディレクトリ \${RPM_BUILD_ROOT} に配置したファイルが自動的に
    rpm化されるわけではなく、rpmに含むファイルを指定する必要があるので、ここで指定する
    また、%defattrで、そのファイルのオーナー,パーミッションをまとめて指定する

- specファイルの作成が完了したら、ソース類、specファイルのシンボリックリンクを作業ディレクトリに作成する

```shell-session
# ソースコードする
ln -s /usr/local/src/rpm_src/nginx/nginx ~/rpmbuild/SOURCES/
ln -s /usr/local/src/rpm_src/nginx/nginx.service ~/rpmbuild/SOURCES/
ln -s /usr/local/src/rpm_src/nginx/nginx-auth-ldap.tar.gz ~/rpmbuild/SOURCES/
ln -s /usr/local/src/rpm_src/nginx/nginx-1.11.3.tar.gz ~/rpmbuild/SOURCES/
# specファイル
ln -s /usr/local/src/rpm_src/nginx/nginx_myrpm.spec ~/rpmbuild/SPECS
```

- rpmbuildコマンドでrpmファイルを作成する

   細かいbpmbuildオプションの詳しい説明は割愛

```shell-session
cd ~/rpmbuild/SPECS

# rpm作成
rpmbuild -bb nginx_myrpm.spec
```

- rpmの確認作業

  エラーでストップしなければ、作成終了しているので、rpmパッケージの確認を行う

```shell-session
# 64bitパッケージなので~/rpmbuild/RPMS/x86_64に作成されている
cd ~/rpmbuild/RPMS/x86_64

# rpm インフォメーションの確認
rpm -qpi nginx_myrpm-1.11.3-1.el7.x86_64.rpm 

# rpm含有ファイルの確認
rpm -qpl nginx_myrpm-1.11.3-1.el7.x86_64.rpm 
```

# yumリポジトリ化

作成したrpmファイルを、独自リポジトリに追加する

- リポジトリ元ディレクトリの作成

 ビルド元サーバーであり、itamae実行サーバーである、centos7−admin にリポジトリを作成する

```shell-session
# rootでリポジトリ元ディレクトリを作成する
su -
mkdir -p /var/lib/myrepo_dir/el7
```

- rpmファイルをリポジトリディレクトリにコピーし、リポジトリ化する

```shell-session
# rootでコピー
su -
cd /var/lib/myrepo_dir/el7
mkdir x86_64

# rpmファイルのコピー(ビルドしたユーザーをxxxと仮定する)
cp /home/xxx/rpmbuild/RPMS/x86_64/nginx_myrpm-1.11.3-1.el7.x86_64.rpm x86_64/

# リポジトリ化
createrepo .

# 確認
ls
#=> repodata  x86_64 となっている筈
```

- リポジトリをweb公開する(LAN内のみ)

　　centos7−adminのnginxに設定を追加する

   ```shell-session:nginx.conf
 
    # リポジトリ用のvirtualhostの設定を追加する
    server {
        listen                    0.0.0.0:80;
        server_name               centos7-admin;
        server_tokens             off;
        root                      /var/lib/myrepo_dir/;
        charset                   utf-8;
        allow                     192.168.56.0/24;
        allow                     127.0.0.1;
        deny                      all;
    }
   ```

   LAN内の公開に限定するので、アクセスIP制限の設定をする
   
- centos7-adminのnginxを再起動させ、virtualhostの設定を反映させる

  ```shell-session
  # restart
  sudo systemctl restart nginx.service

  # 再起動確認
  ps ax|grep nginx
  ```
- オリジナルのリポジトリの追加

  公開設定したリポジトリを myrepo という名前で、OSに追加する

  ```shell-session
  vi /etc/yum.repos.d/myrepo.repo
  ```

```shell-session:myrepo.repo
[myrepo]
name=my repository
#baseurl=file:///var/lib/myrepo_dir
baseurl=http://centos7-admin/el7/
enabled=1
gpgcheck=0
```
- yumで検索してみる

```shell-session
yum search nginx_myrpm

#=> 読み込んだプラグイン:fastestmirror, langpacks
#=> Loading mirror speeds from cached hostfile
#=>  * base: www.ftp.ne.jp
#=>  * extras: www.ftp.ne.jp
#=>  * updates: www.ftp.ne.jp
#=> =========================== N/S matched: nginx_myrpm ===========================
#=> nginx_myrpm.x86_64 : Nginx webserver (with ssl, ldap-auth)
#=> 
#=>   Name and summary matches only, use "search all" for everything.
```