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