萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 使用 FPM 快速打包 RPM 套件實戰教學 (含 Luajit、Tengine 範例)

FPM (Effing Package Management) 是跨平台打包神器,能將目錄、Gem、Python 套件等來源快速轉為 RPM、DEB 等原生格式,並支援安裝/解安裝前後腳本。本文以 CentOS 7 / RHEL 7 為例,示範安裝 FPM 並打包 Luajit 與 Tengine (Nginx 變體) 兩個實戰案例。

環境準備與 FPM 安裝

# 安裝 Ruby 與建構工具
yum -y install ruby rubygems ruby-devel rpm-build gcc make

# 切換 RubyGems 來源至淘寶鏡像 (國內加速)
gem sources -a https://ruby.taobao.org/
gem sources -r https://rubygems.org/

# 安裝 FPM
gem install fpm --no-document

案例一:打包 Luajit 2.0.4

# 建構暫存目錄
mkdir -p /tmp/luajit
cd /usr/local/src
wget https://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar xzf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4

# 指定安裝前綴與 DESTDIR
make PREFIX=/usr
make install PREFIX=/usr DESTDIR=/tmp/luajit

# 使用 FPM 產出 RPM
fpm -s dir -t rpm \
    -n luajit -v 2.0.4 --iteration 1.el7 \
    -C /tmp/luajit \
    -p /root \
    --description 'Luajit RPM package' \
    --url 'https://luajit.org' \
    usr

案例二:打包 Tengine 2.1.0 (含 lua-nginx-module)

mkdir -p /tmp/tengine
cd /usr/local/src

# 取得 lua-nginx-module
wget -O lua-nginx-module-0.9.16.tar.gz \
  https://codeload.github.com/openresty/lua-nginx-module/tar.gz/v0.9.16
tar xzf lua-nginx-module-0.9.16.tar.gz

# 取得 Tengine 原始碼
wget https://tengine.taobao.org/download/tengine-2.1.0.tar.gz
tar xzf tengine-2.1.0.tar.gz
cd tengine-2.1.0

# 配置編譯參數 (依實際部署路徑調整)
./configure \
  --prefix=/opt/share/nginx \
  --sbin-path=/opt/sbin/nginx \
  --conf-path=/opt/etc/nginx/nginx.conf \
  --error-log-path=/opt/log/nginx/error.log \
  --http-log-path=/opt/log/nginx/access.log \
  --user=nginx --group=nginx \
  --with-http_ssl_module --with-http_realip_module \
  --with-http_addition_module --with-http_gzip_static_module \
  --with-http_gunzip_module --with-http_secure_link_module \
  --with-http_stub_status_module --with-http_sysguard_module \
  --with-file-aio \
  --add-module=../lua-nginx-module-0.9.16 \
  --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security' \
  --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro'

make
make install DESTDIR=/tmp/tengine

# 整理目錄結構並加入啟動腳本、logrotate 設定
cd /tmp/tengine/opt
mkdir -p lib/nginx/tmp/{client_body,proxy,uwsgi}
mkdir -p lock/subsys/nginx
cd /tmp/tengine
mkdir -p etc/rc.d/init.d etc/logrotate.d tmp
cp /etc/rc.d/init.d/nginx etc/rc.d/init.d/
cp /etc/logrotate.d/nginx etc/logrotate.d/

撰寫安裝前腳本 (/tmp/tengine/tmp/install_before.sh)

#!/bin/bash
# 停止現有 nginx 進程
[[ -n $(ps aux | grep nginx | grep -v grep) ]] && killall -9 nginx
# 備份舊版設定
[[ -e /opt/etc/nginx ]] && cp -a /opt/etc/nginx /opt/etc/nginx_$(date +%F_%H-%M-%S)

撰寫安裝後腳本 (/tmp/tengine/tmp/install_after.sh)

#!/bin/bash
# 建立系統帳號
getent group nginx  >/dev/null || groupadd -r nginx
getent passwd nginx >/dev/null || useradd -r -g nginx -s /sbin/nologin nginx
getent group www-data >/dev/null || groupadd -r www-data
getent passwd www-data >/dev/null || useradd -r -g www-data -s /sbin/nologin www-data

# 日誌目錄與軟連結
mkdir -p /data/log/nginx
if [[ -e /var/log/nginx ]]; then
  if [[ -L /var/log/nginx ]]; then
    rm -f /var/log/nginx && ln -s /data/log/nginx /var/log/nginx
  else
    mv /var/log/nginx/* /data/log/nginx/ 2>/dev/null
    rm -rf /var/log/nginx && ln -s /data/log/nginx /var/log/nginx
  fi
else
  ln -s /data/log/nginx /var/log/nginx
fi

# 啟動 nginx
/opt/sbin/nginx -c /opt/etc/nginx/nginx.conf
chmod +x /tmp/tengine/tmp/*.sh

fpm -s dir -t rpm \
    -n tengine -v 2.1.0 --iteration 1.waf.el7 \
    -C /tmp/tengine \
    -p /root \
    --description 'Tengine RPM package' \
    --url 'https://tengine.taobao.org' \
    --pre-install /tmp/tengine/tmp/install_before.sh \
    --post-install /tmp/tengine/tmp/install_after.sh \
    .

驗證與安裝

# 檢視 RPM 內含腳本
rpm -qp --scripts /root/tengine-2.1.0-1.waf.el7.x86_64.rpm

# 安裝相依套件並部署
yum -y install pcre pcre-devel openssl openssl-devel
rpm -Uvh /root/luajit-2.0.4-1.el7.x86_64.rpm
rpm -Uvh /root/tengine-2.1.0-1.waf.el7.x86_64.rpm

關鍵參數速查

參數說明
--pre-install安裝前執行腳本
--post-install安裝後執行腳本
--pre-uninstall解安裝前執行腳本
--post-uninstall解安裝後執行腳本
-C切換來源目錄 (chdir)
-p輸出套件目錄

FPM 打包流程示意圖

copyright © 萬盛學電腦網 all rights reserved