一、定制rpm包制作之FPM
什么是定制rpm包?为什么要定制rpm包?

1 将原本使用源码安装的服务,打包成rpm包; 2 使用源码安装,步骤繁琐复杂浪费时间,把源码包打成rpm包安装时可以节省时间,提高工作效率。做好rpm包,可以将rpm包放入yum仓库中,方便安装。
rpm包的俩种制作方式:
1.rpmbuild制作:学会SPEC语言
2.fpm制作:fpm是封装了rpmbuild,不再要求我们学会SPEC语言
本文先讲解fpm制作rpm包:
一、系统环境:

1 [root@localhost ~]# cat /etc/centos-release 2 CentOS Linux release 7.6.1810 (Core) 3 [root@localhost ~]# uname -r 4 3.10.0-957.el7.x86_64 5 [root@localhost ~]# getenforce 6 Disabled 7 [root@localhost ~]# systemctl status firewalld 8 [root@localhost ~]# systemctl stop firewalld
二.安装fpm
1.下载阿里云的base源和epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安装ruby环境
yum -y install ruby rubygems ruby-devel
3.查看gem默认的源
[root@localhost apprun]# gem sources
gem作用:gem和yum差不多,是包管理工具,yum来管理.rpm的包,gem来管理.gem包
4.删除gem默认官方源
gem sources --remove https://rubygems.org/ https://rubygems.org/ removed from sources
查看
[root@localhost apprun]# gem sources
5.添加阿里云的gem源
gem sources -a https://mirrors.aliyun.com/rubygems/ https://mirrors.aliyun.com/rubygems/ added to sources
查看
[root@localhost apprun]# gem sources
*** CURRENT SOURCES ***
https://mirrors.aliyun.com/rubygems/
[root@localhost apprun]#
6.安装fpm
[root@localhost apprun]# gem install fpm -v 1.3.3
....
ERROR: Error installing fpm:
childprocess requires Ruby version >= 2.4.0.
[root@localhost apprun]#
升级ruby:
升级Ruby之前,我们需要先安装Ruby Version Manager(简称RVM),它是Ruby环境的管理器,可以让我们轻松地切换不同的Ruby版本。以下是安装RVM的步骤:
7.安装Ruby Version Manager
第一步:安装gpg密钥[执行第二步会提示]
第二步:安装RVM (会提示安装密钥,网络情况可能需多次操作成功)
curl -L get.rvm.io | bash -s stable
安装完成按提示重新连接就可以使用rvm
[root@localhost ~]# rvm -v
rvm 1.29.12 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
[root@localhost ~]#
将用户添加到rvm组:
查看组:cat /etc/group
root用户加入组: [root@localhost ~]# usermod -aG rvm root
查看root用户所属组列表:
[root@localhost ~]# groups root
root : root rvm
[root@localhost ~]#
列表显示都可以安装ruby的哪些版本
rvm list known
更新ruby至版本3.0.0
rvm install 3.0.0
安装fpm
三、定制rpm包~本文以openresty-1.17.8.1[选取版本过低,为测试后面升级]为例:
1.创建制作目录
mkdir -p /application/tools/
cd /application/tools/
官网准备源码包[上传安装包 openresty-1.17.8.1.tar.gz]
2.开启yum缓存:[自选]
sed -i 's#keelcache=0#keepcache=1#g' /etc/yum.conf
清空本机已有yum缓存:
find /var/cache/ -type f -name "*.rpm" |xargs rm -f
3.编译安装[openresty-1.17.8.1.tar.gz]:

1 cd /application/tools/ 2 3 安装依赖: 4 yum install -y gcc gcc-c++ openssl-devel pcre-devel readline-devel 5 6 下面四行命令,打依赖包[有很强的版本针对性,如果做不到安装机系统版本一致性,不建议采纳] 7 8 find /var/cache/ -type f -name "*.rpm" 9 10 #另存rpm包,依据环境不同 11 find /var/cache/ -type f -name '*.rpm' | xargs cp -t /apprun/tmp/ 12 13 cd /apprun/tmp/ && tar -zcf openresty-1.17.8.1.el7_yum.tar.gz *.rpm 14 15 sz openresty-1.17.8.1.el7_yum.tar.gz 16 17 18 19 cd /application/tools/ 20 21 tar -zxf openresty-1.17.8.1.tar.gz 22 23 cd openresty-1.17.8.1/ 24 ./configure \ 25 --user=apprun \ 26 --group=apprun \ 27 --prefix=/apprun/openresty \ 28 --with-cc-opt=-O2 \ 29 --with-http_ssl_module \ 30 --with-http_realip_module \ 31 --with-stream_realip_module \ 32 --with-stream \ 33 --with-http_stub_status_module \ 34 --with-http_v2_module \ 35 --with-stream \ 36 --with-stream_ssl_module \ 37 --with-stream_ssl_preread_module \ 38 --with-openssl-opt=-g \ 39 --with-stream 40 41 gmake && gmake install
此时openresty-1.17.8.1就被安装在了/apprun/openresty目录下~这样我们的基础源就有了,后面我们就可以依据这个修改定制我们自己适用rpm包了,fpm打包前我们先看下fpm常用参数
FPM常用参数:

1 -s 指定源类型 2 -t 指定目标类型,即想要制作为什么包 3 -n 指定包的名字 4 -v 指定包的版本号 5 -C 指定打包的相对路径 Change directory to here before searching forfiles 6 -d 指定依赖于哪些包 7 -f 第二次打包时目录下如果有同名安装包存在,则覆盖它 8 -p 输出的安装包的目录,不想放在当前目录下就需要指定 9 -m 打包的作者 10 --post-install 软件包安装完成之后所要运行的脚本;同--after-install 11 --pre-install 软件包安装完成之前所要运行的脚本;同--before-install 12 --post-uninstall 软件包卸载完成之后所要运行的脚本;同--after-remove 13 --pre-uninstall 软件包卸载完成之前所要运行的脚本;同--before-remove
编写脚本:[主要通过 上面提到的参数 软件包安装卸载过程前后的状态,执行定制操作,达到我们的目的]
mkdir -p /server/scripts/
cd /server/scripts/
说明:nginx.conf 配置文件定制,我这里是直接修改基础源中的/apprun/openresty/nginx/conf/nginx.conf文件实现的;不过我们也可以定制一个通过脚本覆盖
日志切割文件定制,我这也是直接扔到基础源中/apprun/openresty/nginx/sbin/nginx_log_split.sh
nginx服务脚本,我是扔在基础源目录中,通过下面的脚本处理[sudo cp -r /apprun/openresty/nginx/nginx.service /usr/lib/systemd/system/]
脚本中的参数说明:

1 %pre和%post段 【1,2】 2 3 当传递的第一个参数为1时,表示新安装一个rpm包。 4 5 当传递的第一个参数为2时,表示升级一个已经存在的包。 6 7 %preun和%postun段 【0,1】 8 9 当传递的第一个参数为0时,表示删除一个包。 10 11 当传递的第一个参数为1时,表示更新一个包。
vim openresty_pre_install.sh #软件包安装完成之前所要运行的脚本

1 upgrade() { 2 : 3 #!/bin/sh 4 [ ! -d /apprun/backup/openresty ] && mkdir -p /apprun/backup/openresty 5 /bin/cp /var/spool/cron/root /var/spool/cron/root.bak-`date +%F_%R` 6 /bin/cp /var/spool/cron/root /var/spool/cron/root.bak 7 if [ -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ] 8 then 9 echo "检测/apprun/openresty/nginx/sbin/nginx_log_split.sh 文件存在,升级前备份该文件到/apprun/backup/openresty/" 10 /bin/cp -af /apprun/openresty/nginx/sbin/nginx_log_split.sh /apprun/backup/openresty/ 11 fi 12 13 } 14 _install() { 15 : 16 #!/bin/sh 17 if grep 'apprun' /etc/passwd 18 then 19 echo "apprun exist" 20 else 21 useradd apprun 22 fi 23 24 } 25 if [ "${1}" == 1 ] 26 then 27 # "before install" goes here 28 _install 29 elif [ "${1}" == 2 ] 30 then 31 # "before upgrade" goes here 32 upgrade 33 fi
vim openresty_post_install.sh #软件包安装完成之后所要运行的脚本

1 upgrade() { 2 : 3 #!/bin/sh 4 systemctl enable nginx 5 chown -R apprun:apprun /apprun/openresty 6 [ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs 7 chmod -R 644 /apprun/openresty/nginx/logs 8 echo -e "\033[31m cron 自动清理,cron 已备份文件至: /var/spool/cron/下,并以bak+时间后缀,请以此文件进行恢复 \033[0m" 9 #if grep -i "nginx_log_split.sh" /var/spool/cron/root 10 #then 11 # echo '【温馨提示】请查看nginx_log_split.sh中日志路径是否配置正确。' 12 #else 13 # echo '【温馨提示】已自动创建日志分割、日志清理脚本。请查看nginx_log_split.sh中日志路径是否配置正确。' 14 # 15 # echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root 16 # 17 # echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root 18 #fi 19 if [ -f /var/spool/cron/root.bak ] 20 then cp /var/spool/cron/root.bak /var/spool/cron/root 21 fi 22 23 if [ -f /apprun/backup/openresty/nginx_log_split.sh ] && [ ! -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ] 24 then 25 echo "复制nginx_log_split.sh到新的目录" 26 /bin/cp -af /apprun/backup/openresty/nginx_log_split.sh /apprun/openresty/nginx/sbin/nginx_log_split.sh 27 fi 28 29 } 30 _install() { 31 : 32 #!/bin/sh 33 [ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs 34 chown -R apprun:apprun /apprun/openresty/nginx/logs /apprun/openresty 35 chmod -R 755 /apprun/openresty/nginx/logs 36 sudo cp -r /apprun/openresty/nginx/nginx.service /usr/lib/systemd/system/ 37 sudo systemctl daemon-reload 38 systemctl enable nginx.service 39 echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh >/dev/null 2>/dev/null" >> /var/spool/cron/root 40 41 echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f >/dev/null 2>/dev/null" >> /var/spool/cron/root 42 #[ ! -d /var/log/nginx ] && mkdir -p /var/log/nginx 43 #chown -R apprun:apprun /var/log/nginx /apprun/openresty 44 #chmod -R 755 /var/log/nginx 45 #systemctl enable nginx.service 46 #echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root 47 # 48 #echo "00 01 * * * /usr/bin/find /var/log/nginx -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root 49 50 51 } 52 if [ "${1}" == 1 ] 53 then 54 # "after install" goes here 55 _install 56 elif [ "${1}" == 2 ] 57 then 58 # "after upgrade" goes here 59 upgrade 60 fi
vim openresty_post_uninstall.sh #软件包卸载完成之后所要运行的脚本

1 if [ "${1}" == 0 ] 2 then 3 : 4 #!/bin/sh 5 rm -rf /apprun/openresty 6 #rm -f /usr/lib/systemd/system/nginx.service 7 sed -i '/nginx_log_split.sh/d' /var/spool/cron/root 8 sed -i '/\/apprun\/openresty\/nginx\/logs/d' /var/spool/cron/root 9 10 fi
打包:
fpm -s dir -t rpm -n openresty -v 1.17.8.1 -d 'gcc,gcc-c++,openssl-devel,pcre-devel,readline-devel' \
--pre-install /server/scripts/openresty_pre_install.sh \
--post-install /server/scripts/openresty_post_install.sh \
--post-uninstall /server/scripts/openresty_post_uninstall.sh \
-f /apprun/openresty
虚拟机安装openresty-1.17.8.1-1.x86_64.rpm测试是否符合预期:
能通外网的情况下:建议安装命令采用yum localinstall自动解决依赖问题
yum localinstall -y openresty-1.17.8.1-1.x86_64.rpm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律