zoukankan      html  css  js  c++  java
  • 使用rpmbuild打包erlang和rabbitmq进行部署服务的方法

    使用rpmbuild打包erlang和rabbitmq进行部署服务的方法


    背景说明

    1. rabbitmq 是基于 erlang 开发的消息列队, 本身rabbitmq 自己不区分架构. 
    2. 但是erlang是区分架构的, 需要针对不同架构进行编译
    3. rabbitmq 的命令 需要获取erlang的二进制的路径. 
    4. 有两种方式来处理, 第一种是将erlang的二进制添加进/usr/bin等.
    5. 另外一种方式 可以修改rabbitmq的命令的 环境变量. 可以进行处理. 
    

    获取安装包


    登录rabbitmq的官网, 从官网下载 erlang的二进制
    可以从github上面下载rabbitmq的可执行文件便于使用.
    otp_src_24.0.tar.gz 
    rabbitmq-server-generic-unix-3.9.8.tar.xz
    

    分别在arm和x86里面编译erlang


    注意 最好是找台能上网的机器, 编译起来比较费劲不然. 
    需要安装的rpm包主要如下:
    yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
    注意某些环境下可能需要 --without-javac 的方式来编译
    本次以银河麒麟ARM版本为例进行. 
    解压缩 erlang的源码, cd 到otp的目录中去
    ./configure --prefix /opt/rabbitmq/erlang --without-javac
    注意,这样处理能够节约时间也可以讲源码和编译后的代码进行区分.
    编译完成之后  进入
    /opt/rabbitmq/erlang/bin
    执行
    ./erl
    验证版本. 
    Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
    
    Eshell V12.0  (abort with ^G)
    1> 
    正常情况下如此就可以了.
    
    • 这里说一下比较异常的情况.
    国产linux 内都带有 openssl1.1左右的版本了 erlang 24的版本可以正常使用
    很多centos7 的系统会报缺少 libcrypto.so.1.1
    最简单的解决办法 是从一个有的环境, 职级复制一个这个同架构的二进制文件到
    /usr/lib 目录下就可以避免这个问题. 
    
    • rabbitmq 比较简单 直接解压缩到 /opt/rabbitmq 内部即可.

    rabbitmq的处理

    注意 rabbitmq 如果按照上面的目录 所有的可执行文件都在
    /opt/rabbitmq/sbin 目录下面
    [root@Kylin-arm-vm sbin]# ll
    总用量 44
    -rwxrwxrwx 1 root root  897 10月 28 19:19 rabbitmqctl
    -rwxrwxrwx 1 root root  651 10月 28 19:19 rabbitmq-defaults
    -rwxrwxrwx 1 root root  906 10月 28 19:19 rabbitmq-diagnostics
    -rwxrwxrwx 1 root root 6929 10月 28 19:19 rabbitmq-env
    -rwxrwxrwx 1 root root  902 10月 28 19:19 rabbitmq-plugins
    -rwxrwxrwx 1 root root  859 10月 28 19:19 rabbitmq-queues
    -rwxrwxrwx 1 root root 6044 10月 28 19:19 rabbitmq-server
    -rwxrwxrwx 1 root root  899 10月 28 19:19 rabbitmq-streams
    -rwxrwxrwx 1 root root  902 10月 28 19:19 rabbitmq-upgrade
    
    • 注意这里面需要进行编辑和修改. 需要保证 当前系统没有安装 erlang 23 以下的版本 不然会有异常
    vim 编辑所有的 可执行文件
    在每个文件的头部 增加如下内容
    export PATH=$PATH:/opt/rabbitmq/erlang/bin
    这样的话, 命令就可以直接执行了, 不需要环境变量里面安装 erlang了. 
    执行效果为
    [root@Kylin-arm-vm sbin]# ./rabbitmqctl version
    3.9.8
    
    • 如果没有别的追求, 直接使用 rabbitmq-server 运行服务也是可以的.

    高一点的追求

    尝试作为服务运行, 这样的话可以实现开机自动启动, 
    以及rabbitmq异常时能够自动保活处理.
    方法也比较简单, 编辑一个 rabbitmq.service 即可
    注意 这个名字故意与 rabbitmq-server.service的官方文档进行区分.
    为了在没有网络的情况下快速安装rabbitmq 以及符合安全可靠机器的安装目录要求. 
    编辑一个 rabbitmq.service 的内容主要如下:
    
    • 注意: 这个rabbitmq.service 与 前面的环境变量 其实也不冲突, 主要是systemd管理服务时环境变量的处理不是非常优雅.
    [Unit]
    Description=RabbitMQ broker
    After=syslog.target network.target
    
    [Service]
    Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/rabbitmq/erlang/bin"
    Environment="HOME=/opt/rabbitmq/"
    Environment="LIB=/opt/rabbitmq/erlang/lib:/usr/lib"
    
    Type=notify
    LimitNOFILE=65536
    LimitNPROC=65535
    WorkingDirectory=/opt/rabbitmq
    ExecStart=/opt/rabbitmq/sbin/rabbitmq-server
    ExecStop=/opt/rabbitmq/sbin/rabbitmqctl stop
    ExecStop=/bin/sh -c "while ps -p $MAINPID >/dev/null 2>&1; do sleep 1; done"
    Restart=always
    NotifyAccess=all
    TimeoutStartSec=3600
    
    [Install]
    WantedBy=multi-user.target
    
    • 注意 里面模仿了一些别的官方文档的设置. 不过我好像没搞定 15672的 web端口访问.
    • 注意 环境变量需要给足, 避免程序出现异常.
    • 注意 Restart 的设置, 其实跟 docker run 时添加的 --restart=always 道理是一样的
    systemctl enable rabbitmq  && systemctl restart rabbitmq 
    即可实现服务开机启动和简单的保活
    

    再高一点的追求


    • 很多环境要求必须 使用 rpm包进行安装, 而且为了解决文件比较多和乱 手工处理容易出错的问题.
    • 建议还是将如上的所有的文件打包成 rpm包来进行分发和使用 比较简单.
    • 前提条件是 yum install rpm-build 搭建好 rpmbuild的环境
    yum install rpm-build -y
    mkdir -p /root/rpmbuild/{SPECS,SOURCES,RPMS}
    注意先将资源文件放置到熬如下目录
    /root/rpmbuild/SOURCES
    内容为: 
    [root@Kylin-arm-vm SOURCES]# ll
    总用量 12
    drwx------ 9 root root 4096 10月 28 17:33 rabbitmq
    -rw------- 1 root root  603 10月 28 19:18 rabbitmq.service
    drwx------ 2 root root   61 10月 28 20:30 redis
    -rw------- 1 root root  163 10月 28 20:19 redis.service
    [root@Kylin-arm-vm SOURCES]# pwd
    /root/rpmbuild/SOURCES
     注意 我这里面 打包了 redis和rabbitmq 我感觉redis 比较简单. rabbitmq 可以讲的东西多一点.
     所以就不说怎么打包redis了. 
    
    • 打包好文件和位置之后, 就是需要创建spec文件了, 这里依旧是模仿官方的spec文件进行处理
    位置为 /root/rpmbuild/SPECS/
    添加一个简单的内容 vim rabbitmq.service
    #DEFINES
    %define _binaries_in_noarch_packages_terminate_build   0
    %global __os_install_post %{nil}
    
    Name:       rabbitmq
    Version:    3.9.8
    Release:    1%{?dist}
    Summary:    Rpm package for Rabbitmq ...
    
    Group:      gscloud-rabbitmq
    License:    Copyright © Inspur 浪潮通用软件有限公司
    URL:        https://www.inspur.com/
    Source0:    rabbitmq/
    Source1:    rabbitmq.service
    BuildArch: noarch
    Autoreq:    no
    
    %changelog
    * Sun Apr 18 17:26:47 CST 2021 gscloud-author:zhaobsh
    Initial Version ...
    %description    
    Rpm package for Rabbitmq
    
    %install
    app_dir=%{buildroot}/opt
    %{__install} -p -D %{SOURCE1} $RPM_BUILD_ROOT/etc/systemd/system/rabbitmq.service
    mkdir -p $app_dir                               
    echo pwd
    echo %{SOURCE0}/rabbitmq/
    cp -r %{SOURCE0}/rabbitmq/ $app_dir/
    cp -r %{SOURCE1} /etc/systemd/system/rabbitmq.service
    %files
    %defattr(777,root,root)
    /opt/rabbitmq
    /etc/systemd/system/rabbitmq.service
    %dir    
    /opt/rabbitmq
    
    • 注意 核心 是 install 和 files 处的脚本,一定要保证正常可用.
    • 使用 rpmbuild -bb rabbitmq.spec 就可以进行编译了.
    • 注意我这里是自己先编译 后rpm打包, 很多教程可以实现rpm打包过程时编译(比如之前升级openssh)
    • 感觉没有优劣, 自己打包的好处是有问题可以直接看了修改, rpm的话 等待比较长一些.
    • 打包好的文件在 /root/rpmbuild/RPMS 下面 根据架构存放
    • 其他机器执行 rpm -ivh xxxx.rpm 即可.
  • 相关阅读:
    论语学习系列(一)
    如何编译生成 dll
    Lua学习系列(二)
    Lua学习系列(一)
    Promise对象
    ... 扩展运算符
    class类
    proxy [ˈprɒksi] 代理
    HBuilder 打包流程
    Generator [ˈdʒenəreɪtə(r)] 函数结构
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/15478404.html
Copyright © 2011-2022 走看看