使用 rpmbuild 制作 Nginx 的 RPM 包 (2019 年 11 月 04 日 - 更新 openresty/lua-nginx-module)

2019-11-05 17:16:37 +08:00
 wsgzao

基于 openresty 制作 nginx rpm 安装包

推荐大家向 openresty 转型,我在编译过程中主要遇到以下 4 个小问题

  1. 问题 1 沿用官方的 luajit v2.0.5 编译新版本 lua-nginx-module 应该会提示建议切换至 openresty 的 luajit v2.1 分支
  2. 问题 2 的解决方案是使用低版本 lua-nginx-module v0.10.14 ,使用最新版发现会触发该问题,等待官方修复
  3. 问题 3 的原因是因为 nginx 启动需要一点点时间,而 systemd 在 nginx 完成启动前就去读取 pid file 造成读取 pid 失败
  4. 问题 4 的 libluajit-5.1.so.2 问题跟着我的步骤执行应该不会出现,不需要执行 ln 软链接等操作
[root@gop-sg-192-168-56-103 wangao]# tailf /var/log/nginx/error.log
# 问题 1
2019/11/04 11:59:56 [alert] 2749#2749: detected a LuaJIT version which is not OpenResty's; many optimizations will be disabled and performance will be compromised (see https://github.com/openresty/luajit2 for OpenResty's LuaJIT or, even better, consider using the OpenResty releases from https://openresty.org/en/download.html)

# 问题 2
2019/11/04 11:59:56 [alert] 2749#2749: failed to load the 'resty.core' module ( https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module 'resty.core' not found:
	no field package.preload['resty.core']
	no file './resty/core.lua'
	no file '/usr/local/share/luajit-2.0.5/resty/core.lua'
	no file '/usr/local/share/lua/5.1/resty/core.lua'
	no file '/usr/local/share/lua/5.1/resty/core/init.lua'
	no file './resty/core.so'
	no file '/usr/local/lib/lua/5.1/resty/core.so'
	no file '/usr/local/lib/lua/5.1/loadall.so'
	no file './resty.so'
	no file '/usr/local/lib/lua/5.1/resty.so'
	no file '/usr/local/lib/lua/5.1/loadall.so') in /etc/nginx/nginx.conf:117

# 问题 3
[root@gop-sg-192-168-56-103 wangao]# systemctl status nginx
● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-08-19 01:36:46 +08; 2 months 17 days ago
  Process: 1105 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1071 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 1111 (nginx)
    Tasks: 2
   CGroup: /system.slice/nginx.service
           ├─1111 nginx: master process /usr/sbin/nginx
           └─1112 nginx: worker process

Aug 19 01:36:46 gop-sg-192-168-56-103 systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Aug 19 01:36:46 gop-sg-192-168-56-103 nginx[1071]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Aug 19 01:36:46 gop-sg-192-168-56-103 nginx[1071]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Aug 19 01:36:46 gop-sg-192-168-56-103 systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
Aug 19 01:36:46 gop-sg-192-168-56-103 systemd[1]: Started The NGINX HTTP and reverse proxy server.

# 问题 4
nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

环境初始化

# check current os version and kernel
cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
uname -r
3.10.0-862.el7.x86_64

# yum
yum install -y gcc pam-devel git rpm-build pcre-devel openssl openssl-devel geoip-devel

# mkdir
mkdir -p /root/rpmbuild/SOURCES/
mkdir -p /root/rpmbuild/SPECS/
mkdir -p /root/rpmbuild/RPMS/noarch

# download openssl
cd /usr/local/src
wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2t.tar.gz
tar xf OpenSSL_1_0_2t.tar.gz
mv openssl-OpenSSL_1_0_2t/ openssl-1_0_2t

# install lua
sh luajit2.sh

# confirm these files are correct
[root@gop-sg-192-168-56-103 ~]# tree nginx-rpmbuild-centos7/
nginx-rpmbuild-centos7/
├── build.sh
├── conf_build
│   ├── conf
│   │   ├── django_fastcgi_params
│   │   ├── fastcgi.conf
│   │   ├── fastcgi_params
│   │   ├── koi-utf
│   │   ├── koi-win
│   │   ├── mime.types
│   │   ├── naxsi_core.rules
│   │   ├── nginx.conf
│   │   ├── scgi_params
│   │   ├── sites-available
│   │   │   └── 000_stub_status
│   │   ├── uwsgi_params
│   │   └── win-utf
│   ├── logrotate.d
│   │   └── nginx
│   ├── nginx.conf
│   └── nginx.service
├── luajit2.sh
├── luajit.sh
├── nginx-spec
└── nginx-template
    ├── conf
    │   ├── django_fastcgi_params
    │   ├── naxsi_core.rules
    │   ├── nginx.conf
    │   └── sites-available
    │       └── 000_stub_status
    ├── logrotate.d
    │   └── nginx
    ├── nginx.conf
    └── nginx.service

8 directories, 26 files

luajit2.sh

# https://github.com/openresty/luajit2/releases
LUAVER="v2.1-20190912"
WKDIR="/root/rpmbuild/SOURCES"
cd $WKDIR
wget https://github.com/openresty/luajit2/archive/$LUAVER.tar.gz
tar zxf $LUAVER.tar.gz
rm -f $LUAVER.tar.gz
cd luajit2*
make BUILDMODE=static
make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1
# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
# https://github.com/openresty/lua-nginx-module/issues/8

build.sh


NGX_VER=1.16.1
BDDIR="/root/rpmbuild/BUILD"
WKDIR="/root/rpmbuild/SOURCES"
CURRENTDIR=`dirname $(readlink -f "$0")`
echo $CURRENTDIR
export LUAJIT_LIB=/usr/local/lib
# export LUAJIT_INC=/usr/local/include/luajit-2.0
export LUAJIT_INC=/usr/local/include/luajit-2.1
cd $BDDIR
rm -rf *
cd $WKDIR
rm -rf *
wget http://nginx.org/download/nginx-$NGX_VER.tar.gz
tar xzf nginx-$NGX_VER.tar.gz
rm -f nginx-$NGX_VER.tar.gz
mv nginx-$NGX_VER nginx-garena-$NGX_VER
cd nginx-garena-$NGX_VER/

mkdir -p contrib
cd contrib/
git clone git://github.com/openresty/headers-more-nginx-module.git
git clone git://github.com/openresty/echo-nginx-module.git
git clone git://github.com/simplresty/ngx_devel_kit.git
# git clone git://github.com/openresty/lua-nginx-module
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.14.tar.gz
tar xf v0.10.14.tar.gz
mv lua-nginx-module-0.10.14 lua-nginx-module
git clone git://github.com/nbs-system/naxsi.git
rm -rf */.git
rm -rf *.tar*
cd ..

cp -r $CURRENTDIR/nginx-template/* $WKDIR/nginx-garena-$NGX_VER/
cp $CURRENTDIR/nginx-spec /root/rpmbuild/SPECS/
# cp /root/rules $WKDIR/nginx-garena-$NGX_VER/debian/
cd $WKDIR
tar zcf nginx-garena-$NGX_VER.tar.gz nginx-garena-$NGX_VER/
cd /root/rpmbuild/SPECS/
rpmbuild -ba nginx-spec
cd /root/rpmbuild/RPMS/noarch

nginx-spec


Name: nginx-garena
Version: 1.16.1
Release: 0
Summary: nginx garena rpm
Source0: nginx-garena-%{version}.tar.gz
License: GPL
Group: Rahul
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-buildroot
%description
Garena self-build Nginx.
%define _binaries_in_noarch_packages_terminate_build   0
%prep
%setup -q %{name}-%{version}
%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr/share/nginx/ \
                    --with-ld-opt="-Wl,-rpath,/usr/local/lib" \
                    --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/lock/nginx.lock \
                    --http-client-body-temp-path=/var/lib/nginx/body \
                    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
                    --http-proxy-temp-path=/var/lib/nginx/proxy \
                    --http-scgi-temp-path=/var/lib/nginx/scgi \
                    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
                    --with-pcre-jit \
                    --with-http_flv_module \
                    --with-http_mp4_module \
                    --with-file-aio \
                    --with-http_v2_module \
                    --with-stream \
                    --with-stream_ssl_module \
                    --with-http_auth_request_module \
                    --with-http_slice_module \
                    --with-threads \
                    --with-http_gunzip_module \
                    --with-http_random_index_module \
                    --with-http_secure_link_module \
                    --with-http_geoip_module \
                    --with-http_ssl_module \
                    --with-openssl=/usr/local/src/openssl-1_0_2t \
                    --with-http_addition_module \
                    --with-http_geoip_module \
                    --with-http_gzip_static_module \
                    --with-http_realip_module \
                    --with-ipv6 \
                    --without-mail_pop3_module \
                    --without-mail_imap_module \
                    --without-mail_smtp_module \
                    --add-module=contrib/headers-more-nginx-module \
                    --add-module=contrib/echo-nginx-module \
                    --add-module=contrib/ngx_devel_kit \
                    --add-module=contrib/lua-nginx-module \
                    --add-module=contrib/naxsi/naxsi_src
make -j8

%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
install -m 0755 -d $RPM_BUILD_ROOT/etc/nginx/sites-enabled
install -m 0755 -d $RPM_BUILD_ROOT/etc/nginx/sites-available
install -m 0755 -d $RPM_BUILD_ROOT/var/log/nginx
install -m 0755 -d $RPM_BUILD_ROOT/var/lib/nginx
install -D -m 644 conf/sites-available/000_stub_status $RPM_BUILD_ROOT/etc/nginx/sites-available/000_stub_status
install -D -m 644 conf/django_fastcgi_params $RPM_BUILD_ROOT/etc/nginx/django_fastcgi_params
install -D -m 644 conf/naxsi_core.rules $RPM_BUILD_ROOT/etc/nginx/naxsi_core.rules
install -D -m 644 conf/sites-available/000_stub_status $RPM_BUILD_ROOT/etc/nginx/sites-enabled/000_stub_status
install -D -m 644 logrotate.d/nginx $RPM_BUILD_ROOT/etc/logrotate.d/nginx
install -D -m 644 nginx.service $RPM_BUILD_ROOT/usr/lib/systemd/system/nginx.service
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
%post
useradd -s /sbin/nologin -d /var/www www-data
chown -R www-data.www-data /var/log/nginx /var/lib/nginx
systemctl enable nginx
echo %{name}-%{version} is successfully installed.
systemctl start nginx
%files
%defattr(-,root,root)
%dir /etc/nginx
/etc/nginx/*
%dir /usr/src/debug/nginx-garena-%{version}
/usr/src/debug/nginx-garena-%{version}/*
/usr/sbin/nginx
%dir /usr/share/nginx
/usr/share/nginx/*
/etc/logrotate.d/nginx
/usr/lib/systemd/system/nginx.service
/usr/lib/debug/*
/usr/lib/debug/.build-id/*
%dir /var/log/nginx
%dir /var/lib/nginx
%config(noreplace) /etc/nginx/nginx.conf

logrotate.d/nginx


/var/log/nginx/*.log /var/log/nginx/*/*.log{
	daily
	missingok
	rotate 14
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
		[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
	endscript
}

nginx.conf


user www-data;
worker_processes auto;

#worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 655650;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
        worker_connections  10240;
}


http {
#       include       /etc/nginx/naxsi_core.rules;
        include       mime.types;
        default_type  application/octet-stream;
	log_format garena '$remote_addr - $remote_user [$time_iso8601] "$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" $request_time $upstream_response_time "$http_x_forwarded_for" "$geoip_country_code" "$host"';
        log_format garena_post '$remote_addr - $remote_user [$time_iso8601] "$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" $request_time $upstream_response_time "$http_x_forwarded_for" "$geoip_country_code" "$host" "$request_body"';
	log_format compact '$time_iso8601|$remote_addr|$geoip_country_code|$http_x_forwarded_for|$status|$request_time|$upstream_response_time|$request_length|$body_bytes_sent|$host|$request|$http_referer|$http_user_agent';
	log_format compact_post '$time_iso8601|$remote_addr|$geoip_country_code|$http_x_forwarded_for|$status|$request_time|$upstream_response_time|$request_length|$body_bytes_sent|$host|$request|$http_referer|$http_user_agent|$request_body';


#       access_log  logs/access.log  main;

        sendfile        on;
#       tcp_nopush     on;

        keepalive_timeout  30;
        fastcgi_keep_conn on;
        tcp_nodelay        on;

        gzip  on;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";
        gzip_proxied any;
        gzip_buffers 16 8k;
        gzip_types    text/plain application/javascript application/x-javascript text/javascript text/xml text/css application/json;
        gzip_vary on;
        include /etc/nginx/sites-enabled/*;

	set_real_ip_from 10.0.0.0/8;
	real_ip_header    X-Forwarded-For;
#	real_ip_recursive on;
#	geoip_country /usr/share/GeoIP/GeoIP.dat;

        server_tokens off;         # returns "Server: nginx"
	more_clear_headers Server; # doesn't return "Server: " header at all
}

nginx.service

https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/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

编译生成 nginx rpm

  1. 编辑 build.sh 和 nginx-spec 定义 NGX_VER=1.16.1
  2. 如果需要改变 contrib 的 module 也是修改上述两处位置
sh build.sh

extracting debug info from /root/rpmbuild/BUILDROOT/nginx-garena-1.16.1-0.x86_64/usr/sbin/nginx
dwz: Too few files for multifile optimization
/usr/lib/rpm/sepdebugcrcfix: Updated 1 CRC32s, 0 CRC32s did match.
12776 blocks
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: nginx-garena-1.16.1-0.noarch
warning: File listed twice: /etc/nginx/nginx.conf
Provides: config(nginx-garena) = 1.16.1-0 nginx-garena = 1.16.1-0
Requires(interp): /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Requires: libGeoIP.so.1()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.10)(64bit) libc.so.6(GLIBC_2.11)(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.17)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.7)(64bit) libcrypt.so.1()(64bit) libcrypt.so.1(GLIBC_2.2.5)(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_3.3)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpcre.so.1()(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libz.so.1()(64bit) rtld(GNU_HASH)
warning: Arch dependent binaries in noarch package
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/nginx-garena-1.16.1-0.x86_64
Wrote: /root/rpmbuild/SRPMS/nginx-garena-1.16.1-0.src.rpm
Wrote: /root/rpmbuild/RPMS/noarch/nginx-garena-1.16.1-0.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.Qc7JbE
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd nginx-garena-1.16.1
+ '[' /root/rpmbuild/BUILDROOT/nginx-garena-1.16.1-0.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/nginx-garena-1.16.1-0.x86_64
+ exit 0

[root@sg-gop-10-71-49-5 wangao]# nginx -V
nginx version: nginx/1.16.1
built with OpenSSL 1.0.2t  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx/ --with-ld-opt=-Wl,-rpath,/usr/local/lib --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/lock/nginx.lock --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-pcre-jit --with-http_flv_module --with-http_mp4_module --with-file-aio --with-http_v2_module --with-stream --with-stream_ssl_module --with-http_auth_request_module --with-http_slice_module --with-threads --with-http_gunzip_module --with-http_random_index_module --with-http_secure_link_module --with-http_geoip_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1_0_2t --with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module --with-http_realip_module --with-ipv6 --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --add-module=contrib/headers-more-nginx-module --add-module=contrib/echo-nginx-module --add-module=contrib/ngx_devel_kit --add-module=contrib/lua-nginx-module --add-module=contrib/naxsi/naxsi_src

# Prettier
https://serverfault.com/questions/223509/how-can-i-see-which-flags-nginx-was-compiled-with

[root@sg-gop-10-71-49-5 wangao]# 2>&1 nginx -V | xargs -n1
nginx
version:
nginx/1.16.1
built
with
OpenSSL
1.0.2t
10
Sep
2019
TLS
SNI
support
enabled
configure
arguments:
--prefix=/usr/share/nginx/
--with-ld-opt=-Wl,-rpath,/usr/local/lib
--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/lock/nginx.lock
--http-client-body-temp-path=/var/lib/nginx/body
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-proxy-temp-path=/var/lib/nginx/proxy
--http-scgi-temp-path=/var/lib/nginx/scgi
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi
--with-pcre-jit
--with-http_flv_module
--with-http_mp4_module
--with-file-aio
--with-http_v2_module
--with-stream
--with-stream_ssl_module
--with-http_auth_request_module
--with-http_slice_module
--with-threads
--with-http_gunzip_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_geoip_module
--with-http_ssl_module
--with-openssl=/usr/local/src/openssl-1_0_2t
--with-http_addition_module
--with-http_geoip_module
--with-http_gzip_static_module
--with-http_realip_module
--with-ipv6
--without-mail_pop3_module
--without-mail_imap_module
--without-mail_smtp_module
--add-module=contrib/headers-more-nginx-module
--add-module=contrib/echo-nginx-module
--add-module=contrib/ngx_devel_kit
--add-module=contrib/lua-nginx-module
--add-module=contrib/naxsi/naxsi_src

[root@sg-gop-10-71-49-5 wangao]# 2>&1 nginx -V | xargs -n1 | grep ssl
--with-stream_ssl_module
--with-http_ssl_module
--with-openssl=/usr/local/src/openssl-1_0_2t

[root@sg-gop-10-71-49-5 wangao]# 2>&1 nginx -V | xargs -n1 | grep lua
--add-module=contrib/lua-nginx-module

更新历史

2019 年 11 月 04 日 - 更新 openresty/lua-nginx-module

2019 年 01 月 16 日 - 初稿

阅读原文 - https://wsgzao.github.io/post/rpmbuild/

重复的内容就不再发了,需要了解基础知识可以浏览原文

1908 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/616577

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX