尝试创建支持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文件的内容解释
▼ 开头部分(环境变量等)
▼ 实体组成
请将以下内容用中文进行改写,并提供一种选项:
▽ %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.