概要
nginxのrpmでldap認証に対応しているものが、見つからないので、自分でldap対応モジュールを組み込んで、sourceよりビルドしていく、前の記事で構築したサーバー にitamaeで適用するので、rpmとリポジトリ作成する
前準備
必要なソースコードの取得
nginxオフィシャルより Mainline version の
nginx-1.11.3.tar.gz
nginx-1.11.3.tar.gz.asc
と、
nginx-auth-ldap の gitリポジトリのクローンをする
ビルド用サーバーで一連の作業を行う
また、特別な指示が無い限りは、ビルド作業は一般ユーザーアカウントで行い、rootでは行わないことなぜならば、途中の作業で失敗した時に、システムに実際の追加などが行われないということを確保するため
- (rootユーザーで)ビルドに必要なパッケージをまとめて追加する
# rootユーザーでビルド用の開発ツールグループをまとめて追加する
sudo yum groupinstall "Development Tools"
sudo yum install createrepo
- (rootユーザーで)ソースコード保存ディレクトリ[rpm_src]を作成し、(ビルドユーザーで)必要なソースコードを集める
# 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のソースコードに関して、改竄チェックを行う
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ファイルにまとめる
tar -zcf nginx-auth-ldap.tar.gz nginx-auth-ldap
- tar.gz にまとめたソースコードを使いコンパイルが通るかチェックする、コンパイルオプションはnginxのオフィシャルサイトのMain lineのConfigure Argumentsにする
# ビルドのチェックは /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化作業用のディレクトリを作成する
cd
mkdir rpmbuild
cd rpmbuild
mkdir BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
-
ソースコードからのインストールファイル以外をrpmに含める場合には、そのファイルを準備する
本件では、ソースからのインストールではインストールされない、ログローテート用のファイル(nginx)と、systemctl用のファイル(nginx.service) をrpm化するソース類と同じディレクトリに作成する
(本件だと /usr/local/src/rpm_src/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
}
[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として作成することにする
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ファイルのシンボリックリンクを作業ディレクトリに作成する
# ソースコードする
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オプションの詳しい説明は割愛
cd ~/rpmbuild/SPECS
# rpm作成
rpmbuild -bb nginx_myrpm.spec
-
rpmの確認作業
エラーでストップしなければ、作成終了しているので、rpmパッケージの確認を行う
# 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 にリポジトリを作成する
# rootでリポジトリ元ディレクトリを作成する
su -
mkdir -p /var/lib/myrepo_dir/el7
- rpmファイルをリポジトリディレクトリにコピーし、リポジトリ化する
# 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に設定を追加する
# リポジトリ用の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の設定を反映させる
# restart sudo systemctl restart nginx.service # 再起動確認 ps ax|grep nginx
-
オリジナルのリポジトリの追加
公開設定したリポジトリを myrepo という名前で、OSに追加する
vi /etc/yum.repos.d/myrepo.repo
[myrepo]
name=my repository
# baseurl=file:///var/lib/myrepo_dir
baseurl=http://centos7-admin/el7/
enabled=1
gpgcheck=0
- yumで検索してみる
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.