使用 rpmbuild 制作 rmp 包

一盖腕、安裝軟件

yum install rpmdevtools -y

二钝域、RPM包制作

  1. 建立工作目錄
rpmdev-setuptree #執(zhí)行此條命令妨退,會在用戶家目錄下生成以下幾個目錄
生成的目錄
默認位置 宏代碼 名稱 用途
BUILD %_builddir 構(gòu)建目錄 源碼包解壓至此并完成編譯
RPMS %_prmdir 標準rpm包目錄 生成/保存二進制 RPM 包
SOURCES %_sourcedir 源代碼目錄 保存源碼包(如 .tar 包)和所有 patch 補丁
SPECS %_specdir spec文件目錄 保存rpm包配置文件(.spec)
SRPMS %_srcrpmdir 源代碼rpm包目錄 生成/保存源碼 RPM 包(SRPM)
BUILDROOT %_buildrootdir 最終安裝目錄 保存 %install 階段安裝的文件

二妇萄、把源碼文件放置到 SOURCES 目錄下

源碼文件以及相關配置文件
  • nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user www;
worker_processes 4;
error_log logs/error.log;
pid logs/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.

events {
    use epoll;
    worker_connections  65535;
    multi_accept        on;
}


http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             mime.types;
    default_type        application/octet-stream;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 64k;
    client_max_body_size 1024m;
    gzip on;
    gzip_static on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_min_length 1k;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_proxied off;
    gzip_vary on;
    gzip_comp_level 4;

    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include conf.d/*.conf;
}
  • nginx 啟動腳本
#!/bin/bash
#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:      /usr/local/nginx/conf/nginx.conf

# 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)
pidfile="/usr/local/nginx/logs/nginx.pid"

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' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   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() {
    status $prog
    if [ $? != 0 ]; then
        [ -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
    fi
}

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)
        start && 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
esac
  • fastcgi_params
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_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  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

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;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

三、編寫 spec 文件(SPECS 目錄下)

# vim nginx.spec
Name:       nginx
Version:    1.12.2
Release:    1%{?dist}
Summary:    nginx-1.12.2.tar.gz

Group:      Applications/Archiving
License:    GPLv2        
URL:        http://www.baidu.com
# 所有文件都在 source 目錄下
Source0:    %{name}-%{version}.tar.gz 
Source1:    nginx
Source2:    nginx.conf
Source3:    fastcgi_params
Source4:    nginx.logrotate
Source5:    80.conf

BuildRoot:  %_topdir/BUILDROOT
BuildRequires:  gcc,gcc-c++
Requires:   openssl,openssl-devel,pcre,pcre-devel

%description
This is nginx-1.12.2.rpm!


%prep
%setup -q           


%build
# 用 %configure 會出現(xiàn) "--build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu" 這個錯誤
./configure \
--prefix=/usr/local/nginx \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre
make %{?_smp_mflags} # 如果就多處理器的話make時并行編譯


%install # 主要用于完成實際安裝軟件必須執(zhí)行的命令
rm -rf %{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 %{SOURCE3} %{buildroot}/usr/local/nginx/conf/fastcgi_params
%{__install} -p -D %{SOURCE4} %{buildroot}/etc/logrotate.d/nginx
%{__install} -p -D %{SOURCE5} %{buildroot}/usr/local/nginx/conf/conf.d/80.conf

%pre # rpm 安裝前執(zhí)行的操作
if [ $1 == 1 ];then # $1 有三個值咬荷,0表示卸載冠句,1表示安裝,2表示升級
    # 判斷是否存在www用戶幸乒,以及/www目錄懦底,重復創(chuàng)建用戶會使rpm包制作失敗
    awk '{print $1}' /etc/passwd | grep -q www || /usr/sbin/useradd www -s /sbin/nologin -M &>/dev/null 
    [ -d /www ]  || mkdir /www 
    chown www.www /www -R 
    echo "Hello World!" >>/www/index.html
fi

%post 安裝后執(zhí)行的操作
if [ $1 == 1 ];then
    /sbin/chkconfig --add %{name}
    /sbin/chkconfig %{name} on
    echo '# Add  #下面主要是內(nèi)核參數(shù)的優(yōu)化
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.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024  65535' >> /etc/sysctl.conf
sysctl -p 2>&1 /dev/null
fi

%preun # 卸載前執(zhí)行的操作
if [ $1 == 0 ];then
    /etc/init.d/nginx stop &>/dev/null
fi

%clean
rm -fr %{buildroot}

%files # rpm要包含的文件
%defattr(-,root,root,-)  #設置默認權限
#將需要打包的文件或目錄寫到下面
/etc/logrotate.d/nginx
/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/conf.d/80.conf
%config(noreplace) /usr/local/nginx/conf/fastcgi_params

%changelog

四、打包


完整的目錄結(jié)構(gòu)
rpmbuild  
-ba 既生成src.rpm又生成二進制rpm 
-bs 只生成src的rpm 
-bb 只生二進制的rpm 
-bp 執(zhí)行到pre 
-bc 執(zhí)行到 build段 
-bi 執(zhí)行install段 
-bl 檢測有文件沒包含

一般先rpmbuild -bp ,再-bc 再-bi 如果沒問題罕扎,rpmbuild -bb制作rpm包


編譯完成的rpm包
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聚唐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腔召,更是在濱河造成了極大的恐慌杆查,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀蛛,死亡現(xiàn)場離奇詭異根灯,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門烙肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纳猪,“玉大人,你說我怎么就攤上這事桃笙∈系蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵搏明,是天一觀的道長鼠锈。 經(jīng)常有香客問我,道長星著,這世上最難降的妖魔是什么购笆? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮虚循,結(jié)果婚禮上同欠,老公的妹妹穿的比我還像新娘。我一直安慰自己横缔,他們只是感情好铺遂,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茎刚,像睡著了一般襟锐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膛锭,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天粮坞,我揣著相機與錄音,去河邊找鬼初狰。 笑死捞蚂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的跷究。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敲霍,長吁一口氣:“原來是場噩夢啊……” “哼俊马!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肩杈,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤柴我,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扩然,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘儒,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了界睁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉增。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翻斟,靈堂內(nèi)的尸體忽然破棺而出逾礁,到底是詐尸還是另有隱情,我是刑警寧澤访惜,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布嘹履,位于F島的核電站,受9級特大地震影響债热,放射性物質(zhì)發(fā)生泄漏砾嫉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一窒篱、第九天 我趴在偏房一處隱蔽的房頂上張望焕刮。 院中可真熱鬧,春花似錦舌剂、人聲如沸济锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荐绝。三九已至,卻和暖如春避消,著一層夾襖步出監(jiān)牢的瞬間低滩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工岩喷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恕沫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓纱意,卻偏偏與公主長得像婶溯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子偷霉,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Linux 下RPM打包制作流程 開始前的準備 安裝rpmbuild軟件包 yum -y install rpm-...
    jony456123閱讀 1,459評論 0 1
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成迄委,其中,內(nèi)核的設計非常微小和簡潔类少,完成的工作也非常簡單...
    rosekissyou閱讀 10,211評論 5 124
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,003評論 0 9
  • 《鳥哥的Linux私房菜》筆記 軟件管理器簡介 不是每個人都會進行源碼安裝的晃痴! 廠商先在他們的系統(tǒng)上面編譯好了我們...
    Zhang21閱讀 1,468評論 0 6
  • 一、準備工作: 使用工具: 1.主流版本的docker财忽,本人使用的是 docker 1.91 版本 2.cento...
    dreamer_lk閱讀 2,748評論 1 8