2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-07

概要

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 内に作成)

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
}
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として作成することにする

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ファイルのシンボリックリンクを作業ディレクトリに作成する
# ソースコードする
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に設定を追加する

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の設定を反映させる

    # restart
    sudo systemctl restart nginx.service
    
    # 再起動確認
    ps ax|grep nginx
    
  • オリジナルのリポジトリの追加

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

    vi /etc/yum.repos.d/myrepo.repo
    
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.
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?