jdk node redis nginx mysql直接部署
现场环境有不少是直接使用rpm包进行安装系统,所以需要将环境进行编译后打包成rpm进行部署
目标
将jdk,node,redis,nginx,mysql 编译后,使用rpm打包,再进行服务部署
RPM 打包核心流程与技术要点
1. RPM 基础概念与优势
- 定义:RPM(Red Hat Package Manager)是一种用于红帽系 Linux 发行版(如 RHEL、CentOS、openEuler)的软件包管理系统,支持软件分发、版本管理、依赖追踪和数字签名。
- 核心优势:
- 标准化管理:通过元数据描述包信息(名称、版本、依赖关系),支持安装、升级、回滚等操作;
- 高效部署:结合 YUM/DNF 实现自动化依赖解析,适用于大规模集群部署;
- 安全可控:支持 GPG 签名验证,防止篡改,并通过
rpm -Va
审计文件完整性。
2. 环境准备
工具安装:
yum install rpm-build rpmdevtools # 基础工具链:ml-citation{ref="1,8" data="citationList"} rpmdev-setuptree # 创建标准目录结构(~/rpmbuild):ml-citation{ref="3,8" data="citationList"}
目录结构:
SOURCES
:存放源码压缩包(如.tar.gz
);SPECS
:定义构建规则的.spec
文件;BUILD
:临时编译目录;RPMS
:生成的二进制 RPM 包。
3. SPEC 文件编写
关键字段:
specCopy CodeName: myapp # 包名(需唯一) Version: 1.0 # 版本号 Release: 1%{?dist} # 发布号(区分不同构建环境) Summary: 示例应用 # 简短描述 License: GPLv3+ # 协议类型 URL: http://example.com # 项目主页 Source0: %{name}-%{version}.tar.gz # 源码路径:ml-citation{ref="1,3" data="citationList"} %description # 详细说明 多行描述文本,每行不超过80字符。 %prep # 解压源码 %setup -q %build # 编译命令(如 make) make %{?_smp_mflags} %install # 安装到虚拟根目录 install -d %{buildroot}/usr/bin install -m 755 myapp %{buildroot}/usr/bin/ %files # 声明包内文件路径 /usr/bin/myapp
脚本钩子:
%pre
/%post
:安装前后执行的脚本(如服务注册);%preun
/%postun
:卸载前后的清理操作。
4. 构建与验证
生成 RPM 包:
bashCopy Code rpmbuild -bb ~/rpmbuild/SPECS/myapp.spec # 构建二进制包:ml-citation{ref="3,5" data="citationList"}
验证内容:
- 检查元数据:
rpm -qpi myapp.rpm
; - 查看依赖:
rpm -qpR myapp.rpm
; - 测试安装:
rpm -ivh myapp.rpm
。
- 检查元数据:
5. 高级场景与优化
- 跨平台适配:
- 在 X86 或 ARM 架构下分别编译,通过
%{_arch}
宏区分平台; - 使用
mock
工具在隔离环境中构建,避免宿主污染。
- 在 X86 或 ARM 架构下分别编译,通过
- Python 项目打包:
- 在
%install
阶段创建虚拟环境并安装依赖(pip install -r requirements.txt
); - 使用
%{__python3}
宏指定解释器路径。
- 在
- 自动化集成:
- 结合 CI/CD 工具(如 GitLab CI)自动触发构建;
- 推送至私有仓库(如 Nexus),通过
createrepo
生成仓库元数据。
6. 常见问题
- 依赖冲突:通过
BuildRequires
和Requires
字段精确声明构建/运行时依赖; - 文件遗漏:在
%files
中显式列出所有需打包的文件路径; - 调试构建失败:查看
~/rpmbuild/BUILD
目录下的日志文件。
安装步骤
1.制作rpm包
1.1. node18.10.0 安装
wget https://nodejs.org/dist/v18.10.0/node-v18.10.0-linux-arm64.tar.gz
# 解压安装包
mkdir -p /usr/local/node
cd /usr/local/node
tar -zxvf node-v18.10.0-linux-arm64.tar.gz
#配置环境变量
vi /etc/profile
export NODE_HOME=/usr/local/node/node-v18.10.0-linux-arm64
export PATH=$PATH:$NODE_HOME/bin
source /etc/profile
#验证
node -v
npm -v
1.2. JDK1.8.0_311 安装
wget https://download.oracle.com/otn/java/jdk/8u311-b11/4d5417147a92418ea8b615e228bb6935/jdk-8u311-linux-aarch64.tar.gz
#解压安装包
tar -zxvf jdk-8u311-linux-aarch64.tar.gz 配置环境变量
cat .bashrc
vi /home/test/.bash_profile
rootDir=/home/java
export JAVA_HOME=$rootDir/env/jdk1.8.0_311
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
source /home/test/.bash_profile
验证java -version
1.3. Redis6.2.4 编译安装
redis下载路径
下载地址:https://download.redis.io/releases/
tar -zxvf redis-6.2.4.tar.gz
cd redis-6.2.4
make
make install PREFIX=$PWD/redis
mkdir -p $PWD/redis/conf
mv ./redis.conf $PWD/redis/conf
拷贝当前目录下的redis即可
启动
./bin/redis-server ./conf/redis.conf &
1.4. nginx 1.21.6 源码编译二进制包
nginxInstallPath=/opt/test/testnginx-1.26.1
mkdir nginx && cd nginx
wget http://nginx.org/download/nginx-1.26.1.tar.gz
tar -zxvf nginx-1.26.1.tar.gz
cd nginx-1.26.1
./configure --prefix=$nginxInstallPath --sbin-path=$nginxInstallPath/sbin/nginx --modules-path=$nginxInstallPath/modules --conf-path=$nginxInstallPath/conf/nginx.conf --error-log-path=$nginxInstallPath/logs/error.log --http-log-path=$nginxInstallPath/logs/access.log --pid-path=$nginxInstallPath/logs/nginx.pid --lock-path=$nginxInstallPath/logs/nginx.lock --http-client-body-temp-path=$nginxInstallPath/cache/client_temp --http-proxy-temp-path=$nginxInstallPath/proxy/proxy_temp --http-fastcgi-temp-path=$nginxInstallPath/fastcgi_temp --http-uwsgi-temp-path=$nginxInstallPath/uwsgi_temp --http-scgi-temp-path=$nginxInstallPath/scgi_temp --user=test --group=test --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common
make
make install
1.5. mysql源码编译二进制包
mysqlInstallPath=/opt/test/testmysql-5.7.23
mysqlDataPath=/home/test/testmysql
yum install cmake -y
yum install openssl* -y
yum install ncurses-devel -y
# 安装相关依赖
# rpcgen 依赖
mkdir rpcgen && cd rpcgen
wget http://192.168.0.180:8098/tools/rpcsvc-proto-1.4.tar.gz
tar -zxvf rpcsvc-proto-1.4.tar.gz
cd rpcsvc-proto-1.4
./configure
make
make install
cd ..
cd ..
# 解压mysql源码
# 拷贝源码压缩包到compile_mysql中
mkdir compile_mysql && cd compile_mysql
wget http://192.168.0.180:8098/tools/mysql-boost-5.7.23.tar.gz
tar -zxvf mysql-boost-5.7.23.tar.gz
cd mysql-5.7.23
mysqlPath=$PWD
mkdir bld && cd bld
# 这里需要注意的是,可以指定一些默认配置信息,可以参考
# https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html#option_cmake_mysql_datadir
cmake .. -DWITH_BOOST=$mysqlPath/boost -DCMAKE_INSTALL_PREFIX=$mysqlInstallPath -DCPACK_MONOLITHIC_INSTALL=1 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DMYSQL_UNIX_ADDR=$mysqlInstallPath/mysql.sock -DMYSQL_DATADIR=$mysqlDataPath/data -DSYSCONFDIR=$mysqlInstallPath/my.cnf
# 编译
make
# 提取打包tar.gz
make package
# 效果如下:
# [100%] Built target mysql_embedded
# [100%] Built target mysql_client_test_embedded
# [100%] Built target my_safe_process
# Run CPack packaging tool...
# CPack: Create package using TGZ
# CPack: Install projects
# CPack: - Run preinstall target for: MySQL
# CPack: - Install project: MySQL
# CPack: Create package
# CPack: - package: /home/compile_mysql/mysql-5.7.41/bld/mysql-5.7.41-linux-aarch64.tar.gz generated.
2.构建rpm包
2.1. rpm 安装包构建目录结构说明
.
└── test-rpm
├── rpmbuild
| └── build.sh
├── test
| ├── 其他文件
| └── build.sh
├── testjdk
| ├── 其他文件
| └── build.sh
├── testmysql
| ├── 其他文件
| └── build.sh
├── testnginx
| ├── 其他文件
| └── build.sh
├── testnodejs
| ├── 其他文件
| └── build.sh
└── testredis
├── 其他文件
└── build.sh
2.1.1. rpmbuild 目录的build.sh
vi build.sh
#!/bin/sh
# 当前目录
CURRENT_DIR=$(
cd "$(dirname "$0")"
pwd
)
cd ..
rootPath=$PWD
echo "rootPath: $rootPath"
projects=(testjdk testredis testnodejs testnginx testmysql test)
versions=(1.8 6.2.4 18.10.0 1.26.1 5.7.23 4.0.0)
n=0
while [ $n -lt ${#projects[@]} ]
do
echo "------------------------------------------------------------------------------------------------"
echo "build ${projects[$n]}"
echo "cd ${rootPath}/${projects[$n]} && bash ./build.sh ${projects[$n]} ${versions[$n]} && \cp -r ${rootPath}/${projects[$n]}/*.rpm ${CURRENT_DIR}"
echo "------------------------------------------------------------------------------------------------"
cd ${rootPath}/${projects[$n]} && bash ./build.sh ${projects[$n]} ${versions[$n]} && \cp -r ${rootPath}/${projects[$n]}/*.rpm ${CURRENT_DIR}
n=$((n+1))
done
rm -rf $CURRENT_DIR/rpmbuild
echo "------------------------------------------------------------------------------------------------"
echo "目录文件"
ls -lstrh $CURRENT_DIR
2.1.2. 其他目录的build.sh
#生成spec文件
PROJECT_NAME=$1
# 版本号
VERSION=$2
# 当前版本的第几次打包
RELEASE=1
# 处理器架构
# ARCH="x86_64"
ARCH="aarch64"
# 项目描述信息
SUMMARY="${PROJECT_NAME}"
# rpm包安装路径
INSTALL_PATH="/opt/test/${PROJECT_NAME}-${VERSION}"
# 配置和管理集群所使用的用户
ADMINISTRATOR="test"
# 当前目录
CURRENT_DIR=$(
cd "$(dirname "$0")"
pwd
)
echo "
Name : ${PROJECT_NAME}
Version: ${VERSION}
Release: ${RELEASE}
Summary: ${SUMMARY}
License: www.test.cn
%description
%prep
# 删除之前的残留文件
rm -rf %{buildroot}
mkdir -p %{buildroot}
rpm_app_dir=%{buildroot}${INSTALL_PATH}
mkdir -p \$rpm_app_dir
cp -r ${CURRENT_DIR}/* \$rpm_app_dir
rm -rf \$rpm_app_dir/${PROJECT_NAME}.spec
rm -rf \$rpm_app_dir/build.sh
%files
${INSTALL_PATH}
%post
chown -R ${ADMINISTRATOR}:${ADMINISTRATOR} ${INSTALL_PATH}
chmod -R 755 ${INSTALL_PATH}
" > ${CURRENT_DIR}/${PROJECT_NAME}.spec
# 清除特殊字符
sed -i 's/\r//' ./*.sh
rm -rf /root/rpmbuild
rm -rf /var/tmp/*
rm -rf ${CURRENT_DIR}/*.rpm
#构建rpm包
rpmbuild -bb ${CURRENT_DIR}/${PROJECT_NAME}.spec
# 拷贝包
rpm_count=`ls ${HOME}/rpmbuild/RPMS/${ARCH}/${PROJECT_NAME}-${VERSION}*.rpm | wc -l`
if [ $rpm_count -gt 0 ];then
cp ${HOME}/rpmbuild/RPMS/${ARCH}/${PROJECT_NAME}-${VERSION}*.rpm ${CURRENT_DIR}
fi
rm -rf ${CURRENT_DIR}/${PROJECT_NAME}.spec
rm -rf /root/rpmbuild
构建完毕,生成文件如下:
.
└── test-rpm
└── rpmbuild
├── test-4.0.0-1.ky10.aarch64.rpm
├── testjdk-1.8-1.ky10.aarch64.rpm
├── testmysql-5.7.23-1.ky10.aarch64.rpm
├── testnginx-1.26.1-1.ky10.aarch64.rpm
├── testnodejs-18.10.0-1.ky10.aarch64.rpm
└── testredis-6.2.4-1.ky10.aarch64.rpm
3.RPM 安装目录
3.1. rpm安装包安装后目录结构
.
└── opt
└── test
├── test-4.0.0
│ ├── server
│ └── bin
│ ├── install.sh
│ └── version
├── testjdk-1.8
├── testmysql-5.7.23
├── testnginx-1.26.1
├── testnodejs-18.10.0
└── testredis-6.2.4
3.2. 系统安装后目录结构
.
└── opt
└── test
├── test-4.0.0
├── testjdk-1.8
├── testmysql-5.7.23
├── testnginx-1.26.1
├── testnodejs-18.10.0
└── testredis-6.2.4
.
└── ${HOME} // ${HOME} > /home/test
├── test
│ ├── logs
│ └── data
├── testmysql
├── testnginx
└── testredis