jdk node redis nginx mysql直接部署

发布于:2025-04-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

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 工具在隔离环境中构建,避免宿主污染‌。
  • ‌Python 项目打包‌:
    • %install 阶段创建虚拟环境并安装依赖(pip install -r requirements.txt)‌;
    • 使用 %{__python3} 宏指定解释器路径‌。
  • ‌自动化集成:
    • 结合 CI/CD 工具(如 GitLab CI)自动触发构建‌;
    • 推送至私有仓库(如 Nexus),通过 createrepo 生成仓库元数据‌。

6. 常见问题

  • 依赖冲突‌:通过 BuildRequiresRequires 字段精确声明构建/运行时依赖‌;
  • 文件遗漏‌:在 %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

网站公告

今日签到

点亮在社区的每一天
去签到