尝试创建支持LDAP认证的Nginx RPM

摘要

由于找不到已对LDAP认证进行支持的nginx的rpm软件包,我将自己将LDAP支持模块集成到源码中并进行编译,然后使用itamae将其应用于之前构建的服务器,并创建rpm软件包和软件源。

准备事前

获取所需的源代码

从nginx官方获取Mainline版本的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

除了在主要配置中的“Configure Arguments”中,为了明确地进行64位编译,还需要添加“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に含める場合には、そのファイルを準備する

在/usr/local/src/rpm_src/nginx目录下创建与将不会通过源文件安装的日志轮转文件(nginx)和systemctl文件(nginx.service)进行RPM包化的源文件。

/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 でOKBuildRequires:rpm化作業時に必要になる依存パッケージRequires:作成したrpmのインストール時に同時にインストールされる依存パッケージConflicts:同時にインストールできない共存不可パッケージ

▼ 实体组成

请将以下内容用中文进行改写,并提供一种选项:
▽ %description

パッケージの内容説明

以下是我只需要一种选项的中文释义:
– 在中文中,%prep 可以表示为 “动词短语”。

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

▽ %设置

ソースコードの展開をおこなう
意味としては、 
%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] にすると指定している

△ %建築

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

安装百分号

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/
で配置する

▽ %整洁

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

请用中文将以下内容进行释义,只需要一种选项:

▽ %pre

预处理器

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

▽%卸载后

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

▽ %文件 %默认属性

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ファイルを作成する

關於細微的 bpm 建構選項詳細說明省略不讀。

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的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”的名称添加进去。

  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.
广告
将在 10 秒后关闭
bannerAds