您的位置:首页 > 运维架构 > Nginx

nginx源码打包成rpm包记录

2017-08-01 18:09 375 查看
nginx只支持源码编译运行,不是很方便进行多环境部署,因此需要将源码打包成rpm包。

1.安装rpm包打包所需相关工具

yum -y install gcc

       
yum -y install rpm-build

2.准备源码以及rpm打包所需文件

    


2.1nginx.init脚本(service支持脚本)

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
## config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# config: /etc/sysconfig/nginx
## pidfile: /var/run/nginx/nginx.pid
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
#NGINX_CONF_FILE="/etc/nginx/nginx.conf"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac2.2gen.sh脚本(直接执行./configure脚本,得到的结果与需要的不符,因此写了一个脚本来进行参数指定)
#!/bin/bash
./configure --prefix=/usr/local/nginx/ --with-http_ssl_module --with-http_sub_module --with-http_auth_request_module2.3fastcgi_params参数
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;2.4nginx.spec文件
Name: nginx
Version: 1.1.7
Release: 2
Summary: nginx-1.1.0.tar.gz to nginx-1.7.7.rpm
Group: Applications/Archiving
License: Copyright
Source0: %{name}-%{version}.tar.gz
Source1: nginx.init
Source2: fastcgi_params
Source3: example_com.crt
Source4: example_com.key
BuildRoot: %_topdir/BUILDROOT

BuildRequires: gcc,pcre-devel,openssl-devel
Requires: openssl,pcre

%description
Custom an nginx rpm, to be a part of VAP;

%prep
%setup -c

%build
./gen.sh
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
make install DESTDIR=%{buildroot}
%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx
#%{__install} -p -D %{SOURCE2} %{buildroot}/usr/local/nginx/conf/nginx.conf
%{__install} -p -D %{SOURCE2} %{buildroot}/usr/local/nginx/conf/fastcgi_params
%{__install} -p -D %{SOURCE3} %{buildroot}/usr/local/nginx/cert/example_com.crt
%{__install} -p -D %{SOURCE4} %{buildroot}/usr/local/nginx/cert/example_com.key

%pre
if [ $1 == 1 ];then
/usr/sbin/useradd -r www -s /sbin/nologin 2> /dev/null
mkdir -p %{buildroot}/%{name}-%{version}
fi

%post
if [ $1 == 1 ];then
/sbin/chkconfig --add %{name}
/sbin/chkconfig --level 2345 %{name} on
echo '
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000927000000
net.ipv4.tcp_max_orphans = 3276800

net.ipv4.ip_local_port_range = 1024 65535' >> /etc/sysctl.conf
sysctl -p 2>&1 /dev/null
fi
if [ $1 -gt 1 ]; then
/sbin/service nginx start >/dev/null &
fi
echo "OK, nginx has been installed!"

%preun
if [ $1 == 0 ];then
/usr/sbin/userdel -r www 2> /dev/null
#/etc/init.d/nginx stop > /dev/null 2>&1
/sbin/service nginx stop >dev/null
fi

%postun
if [ $1 -eq 0 ]; then
rm -rf /usr/local/nginx
echo "OK, nginx has been uninstalled!"
fi

%clean
rm -rf %{buildroot}

%files
/usr/local/nginx/cert/example_com.crt
/usr/local/nginx/cert/example_com.key
%defattr(-,root,root,0755)
/usr/local/nginx/
%attr(0755,root,root) /etc/rc.d/init.d/nginx
%config(noreplace) /usr/local/nginx/conf/nginx.conf
%config(noreplace) /usr/local/nginx/conf/fastcgi_params
%config(noreplace) /usr/local/nginx/cert/example_com.crt
%config(noreplace) /usr/local/nginx/cert/example_com.key

%changelog

2.5 build.sh脚本
#########################################################################
# File Name: build.sh
# Author: liuhj
# mail: 805577846@qq.com
# Created Time: Mon 31 Jul 2017 02:32:58 PM CST
#########################################################################
#!/bin/bash
set -x

if [ "$1" == "help" ]; then
echo "Usage: $0 <appname> <dist dir>"
exit 1
fi

cur_path=$(cd "$(dirname "$0")"; pwd)
appname=${1:-nginx}
dist_root=${2:-$cur_path}
if [ "x${dist_root:0:1}" = "x/" ];then
dist_root=$dist_root
else
dist_root=$cur_path/$dist_root
fi
bulid_out=$dist_root/$appname

spec=$appname.spec

[ ! -f $spec ] && echo "$spec is not exist." && exit 1
SUBDIR=(src html nginx.spec conf man auto contrib configure gen.sh cert version.txt build.sh)
mkdir $bulid_out -p
Version=`head -1 ./version.txt | sed 's/[\r]//g'`
Version1=`head -1 ./version.txt | sed 's/[\t]//g' | awk -F "-" '{print $1}'`

version=`cat $spec |grep Version|awk '{print $2}'`

realse=`head -1 ./version.txt | sed 's/[\t]//g' | awk -F "-" '{print $2}'`
sed -i "/^[[:space:]]*Version: /s/\ .*/ ${Version1}/" $spec
sed -i "/^[[:space:]]*Release: /s/\ .*/ ${realse}/" $spec

NAME=$appname-${Version1}
TAR=$bulid_out/${NAME}.tar.gz
[ -f $bulid_out/$NAME.x86_64.rpm ] && echo "$NAME.x86_64.rpm already exist." && exit 0

rpmdir=$dist_root/build

./gen.sh
tar czvf ${TAR} ${SUBDIR[@]}
#mv ${TAR} /usr/src/redhat/SOURCES -f
#cp ./nginx.init /usr/src/redhat/SOURCES -f
rm -rf $rpmdir
mkdir -p $rpmdir
mkdir -p $rpmdir/$NAME

mv ${TAR} $rpmdir
cp ./nginx.init $rpmdir
cp ./configure $rpmdir
cp ./fastcgi_params $rpmdir
#cp -rf ./cert $rpmdir
cp ./cert/example_com.crt $rpmdir
cp ./cert/example_com.key $rpmdir

rpmbuild -bb --define "_topdir ${rpmdir}" \
--define "_rpmdir ${rpmdir}" \
--define "_builddir ${rpmdir}" \
--define "_sourcedir ${rpmdir}" \
--define "_specdir ${rpmdir}" \
--define "_srcrpmdir ${rpmdir}" \
$spec --clean --rmsource

#rpmbuild -bb $spec --clean --rmsource

if [ $? -eq 0 ]
then
echo "create rpm success"
else
echo "create rpm fail"
exit 1
fi
echo "mv /usr/src/redhat/RPMS/x86_64/${NAME}* $bulid_out "
mv /usr/src/redhat/RPMS/x86_64/${NAME}* $bulid_out -f
mv /usr/src/redhat/RPMS/x86_64/${appname}-devel-${Version}-${realse}* $bulid_out -f
rm /usr/src/redhat/RPMS/x86_64/${appname}* -f


2.6 version.txt为版本信息文件,指定你想要打的rpm包的版本
第一行格式为x.x.x-x

这些工作都做完后,只需要运行build.sh脚本就OK啦~

rpm包会放在当前目录的build目录的x86_64下

[root@localhost nginx]# tree build

build

├── BUILDROOT

├── configure

└── x86_64

    ├── nginx-1.1.7-2.x86_64.rpm

    └── nginx-debuginfo-1.1.7-2.x86_64.rpm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: