CentOS 7下RabbitMQ与Erlang官方RPM包安装部署指南

1. 项目概述与核心价值

最近在给一个微服务项目做部署,环境是CentOS 7,需要安装RabbitMQ作为消息中间件。这活儿听起来简单,不就是下载个.rpm包然后yum install一下吗?但真上手了才发现,RabbitMQ和它的“灵魂伴侣”Erlang在Linux下的安装,尤其是通过官方.rpm包的方式,坑点还真不少。网上教程五花八门,有的直接用EPEL仓库的旧版本,有的编译安装Erlang搞得环境乱七八糟,对于生产环境来说,版本可控、依赖清晰、卸载干净才是硬道理。所以,我决定把这次通过官方.rpm文件安装RabbitMQ和Erlang的完整过程、背后的原理,以及踩过的那些坑,系统地梳理一遍。如果你也在寻求一种干净、可控、适合生产环境的安装方式,这篇记录应该能帮到你。

简单来说,这个方法的核心价值在于:绕过系统仓库可能存在的版本滞后问题,直接从RabbitMQ和Erlang官方获取指定版本的.rpm包进行安装,实现版本精准控制,并且保持依赖管理的清晰性,便于后续的升级和维护。整个过程会涉及Erlang解决方案的选择、GPG密钥验证、系统依赖检查等关键步骤,我会逐一拆解。

2. 核心思路与方案选型解析

2.1 为什么选择.rpm包而非源码编译或仓库安装?

在Linux下安装软件,常见的有三种方式:源码编译、通过系统仓库(如yum)安装、使用预编译的二进制包(如.rpm, .deb)。对于RabbitMQ这种包含复杂运行时(Erlang)的服务,选择需要慎重。

  • 源码编译:最灵活,可以极致优化。但编译Erlang本身就是一个耗时且容易出错的过程,需要解决大量依赖(如ncurses-devel, openssl-devel等)。对于生产环境,我们追求的是稳定和可重复性,而不是极致的性能调优,因此源码编译通常不是首选。
  • 系统仓库安装:最方便,一条命令yum install rabbitmq-server即可。但缺点非常明显:版本严重滞后。CentOS/RHEL系以稳定著称,其官方仓库中的软件版本往往比上游社区晚好几个大版本。你可能安装到一个非常老的RabbitMQ,无法使用新特性,甚至存在已知的安全漏洞。EPEL仓库情况稍好,但版本仍然不够新,且可能与系统其他组件存在不可预见的依赖冲突。
  • 官方.rpm包安装:这是我们本次采用的方法。它平衡了可控性和便利性。
    • 优势:直接从软件官方获取,版本最新或可自由选择历史版本;依赖关系明确(包内已声明);安装、卸载、查询都由RPM包管理系统统一管理,干净利落。
    • 挑战:需要手动处理Erlang运行时依赖;需要从两个不同的官方源下载包;需要关注GPG签名验证以确保包的安全性。

结论:对于需要较新版本、且希望部署过程清晰可追溯的生产环境,直接使用官方.rpm包是最佳实践。

2.2 Erlang版本匹配:RabbitMQ的“生命线”

这是安装RabbitMQ前最重要的一步。RabbitMQ是用Erlang语言编写的,它运行在Erlang虚拟机(BEAM)上。并非任何Erlang版本都能运行任何RabbitMQ版本,两者有严格的兼容性要求。

RabbitMQ官方维护着一个详细的 兼容性矩阵 。在决定安装版本前,必须去这个页面核对。例如,RabbitMQ 3.13.x通常要求Erlang 25.2或更高版本,并且对26.x也有明确支持。

重要提示:永远不要使用系统仓库里陈旧的Erlang(比如CentOS 7默认的Erlang 18/19)来运行新版的RabbitMQ,这会导致服务无法启动或运行时出现诡异错误。

我们的方案是:根据选定的RabbitMQ版本,去Erlang官方仓库下载对应兼容的、专门为RabbitMQ构建的Erlang .rpm包。RabbitMQ团队贴心地为一些主流Erlang版本提供了优化构建的包,这些包通常标记为esl(Erlang Solutions)或直接来自Erlang官方仓库。

2.3 系统环境准备与依赖检查

在开始下载安装包之前,我们需要确保系统环境是干净的,并且具备必要的工具。我们将在一台全新的CentOS 7.9最小化安装系统上操作。

首先,更新系统并安装一些基础工具:

sudo yum update -y sudo yum install -y wget socat logrotate
  • wget:用于从网络下载文件。
  • socat:RabbitMQ管理插件可能依赖的网络工具。
  • logrotate:系统日志轮转工具,RabbitMQ会使用它来管理自己的日志。

检查是否已有旧版本Erlang或RabbitMQ:

# 检查Erlang erl -version 2>/dev/null || echo “Erlang not found” # 检查RabbitMQ rpm -qa | grep -E “rabbitmq|erlang”

如果发现有旧版本,特别是通过非RPM方式安装的,需要先彻底清理,避免冲突。使用yum remove卸载RPM包,并手动清理残留配置和数据目录(/var/lib/rabbitmq/,/etc/rabbitmq/)。

3. 实操步骤详解:下载与安装

接下来,我们进入核心实操环节。假设我们计划安装RabbitMQ 3.13.0,根据兼容性表,我们选择与之匹配的Erlang 26.2.1

3.1 下载Erlang官方RPM包

Erlang的官方包存放于https://packages.erlang-solutions.com/erlang/。我们需要找到适用于CentOS 7(EL 7)的RPM包。

  1. 确定包名:Erlang RPM包命名通常有固定模式,例如:esl-erlang_26.2.1-1~centos~7_amd64.rpm。其中esl-erlang是包名,26.2.1是版本,1是发布版本号,centos~7指代系统,amd64是架构。

  2. 执行下载:我们可以使用wget直接下载。为了确保可重复性,建议将下载命令写在脚本里或记录下完整URL。

    # 创建软件包存放目录 sudo mkdir -p /opt/software cd /opt/software # 下载Erlang 26.2.1 RPM包 (请注意,具体URL可能随版本更新而变化,以下为示例) sudo wget https://packages.erlang-solutions.com/erlang/esl-erlang/FLAVOUR_1_general/esl-erlang_26.2.1-1~centos~7_amd64.rpm

    实操心得:Erlang Solutions的仓库结构有时会调整。如果上述URL失效,最可靠的方法是访问https://packages.erlang-solutions.com/erlang/,在页面中导航找到对应版本和系统的目录,然后复制链接。对于生产环境,建议将重要的RPM包备份到内部文件服务器或制品仓库(如Nexus)中。

3.2 下载RabbitMQ官方RPM包

RabbitMQ的官方RPM包托管在GitHub Releases上,地址规律是:https://github.com/rabbitmq/rabbitmq-server/releases/download/v{版本}/rabbitmq-server-{版本}-1.el7.noarch.rpm

  1. 执行下载
    # 继续在 /opt/software 目录下操作 # 下载RabbitMQ 3.13.0 RPM包 sudo wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.0/rabbitmq-server-3.13.0-1.el7.noarch.rpm
    • noarch表示这个包是架构无关的,因为RabbitMQ是Erlang字节码,在任何架构的Erlang虚拟机上都能运行。
    • 1.el7是发布版本号,针对EL7(RHEL/CentOS 7)系统。

3.3 安装Erlang RPM包

安装下载好的Erlang包。这里可能会遇到依赖问题,因为Erlang的RPM包可能依赖一些特定的系统库。

cd /opt/software sudo rpm -ivh esl-erlang_26.2.1-1~centos~7_amd64.rpm

如果使用rpm -ivh安装时报告依赖错误(例如缺少libcrypto.so.1.1libstdc++等),不要慌张。这通常是因为系统自带的库版本过低。

解决方案

  • 方案A(推荐):使用yum localinstall,它会自动尝试从配置的Yum仓库中解决依赖。
    sudo yum localinstall -y esl-erlang_26.2.1-1~centos~7_amd64.rpm
  • 方案B:如果yum localinstall也无法解决,可能是需要配置额外的仓库(如EPEL)或更新基础库。确保EPEL仓库已启用:
    sudo yum install -y epel-release sudo yum update -y
    然后再次尝试yum localinstall

验证Erlang安装

erl -version # 或进入Erlang shell查看版本信息 erl 1> erlang:system_info(otp_release). “26” 2> halt().

看到正确的版本号输出,说明Erlang安装成功。

3.4 安装RabbitMQ RPM包

Erlang就绪后,安装RabbitMQ就简单多了。

cd /opt/software sudo yum localinstall -y rabbitmq-server-3.13.0-1.el7.noarch.rpm

yum localinstall会检查RabbitMQ包的依赖,此时核心依赖esl-erlang我们已经安装,所以过程会很顺利。

安装完成后,RabbitMQ的相关文件会部署到以下标准位置:

  • 配置文件目录/etc/rabbitmq/(初始可能只有一个rabbitmq-env.conf示例文件)
  • 数据与日志目录/var/lib/rabbitmq/,/var/log/rabbitmq/
  • 服务管理脚本/usr/lib/systemd/system/rabbitmq-server.service(Systemd)
  • 命令行工具/usr/sbin/rabbitmqctl,/usr/sbin/rabbitmq-plugins,/usr/sbin/rabbitmq-server

3.5 管理服务与基础配置

  1. 启动服务并设置开机自启

    sudo systemctl daemon-reload # 重新加载Systemd配置 sudo systemctl enable rabbitmq-server # 启用开机自启 sudo systemctl start rabbitmq-server # 启动服务 sudo systemctl status rabbitmq-server # 检查状态

    看到active (running)状态即为成功。

  2. 启用Web管理插件:RabbitMQ自带一个基于Web的管理控制台,非常方便。

    sudo rabbitmq-plugins enable rabbitmq_management

    执行后,会提示安装一些依赖插件(如cowboy,rabbitmq_web_dispatch等),确认即可。

  3. 创建管理用户:默认的guest用户只能在本地登录。我们需要创建一个新管理员用户。

    # 添加用户,用户名‘admin’,密码‘YourStrongPassword123!’ sudo rabbitmqctl add_user admin ‘YourStrongPassword123!’ # 设置标签为‘administrator’,拥有所有权限 sudo rabbitmqctl set_user_tags admin administrator # 设置虚拟主机‘/’上的所有权限 sudo rabbitmqctl set_permissions -p / admin “.*” “.*” “.*”

    安全警告:务必使用强密码,并在生产环境中考虑使用rabbitmqctl add_user admin以交互方式输入密码,避免在命令行历史中留下明文密码。

  4. 访问管理界面:打开浏览器,访问http://<你的服务器IP>:15672。使用上面创建的admin账号登录。

4. 深入解析:GPG验证与仓库化安装

4.1 为什么要进行GPG验证?

直接从网上下载二进制包安装,存在被篡改的风险。GPG(GNU Privacy Guard)签名验证可以确保你下载的软件包确实来自官方,且未被中间人修改。这是一种重要的安全实践。

RabbitMQ和Erlang的GPG密钥验证流程

  1. 导入公钥:首先需要将软件官方的GPG公钥导入到系统的RPM密钥环中。
  2. 验证签名:在安装RPM包时,使用rpm命令的--checksig-K选项来验证包的签名。

以RabbitMQ为例

  • RabbitMQ团队的GPG密钥ID通常可以在其GitHub仓库或下载页面找到。
  • 导入密钥(示例,具体密钥ID需查阅官方文档):
    sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
  • 验证包签名:
    rpm -K rabbitmq-server-3.13.0-1.el7.noarch.rpm
    输出中应包含digests signatures OKgpg OK字样。

对于Erlang Solutions的包,过程类似,需要从其官网找到对应的公钥进行导入。虽然手动安装时有时会跳过这一步,但对于生产环境,尤其是安全要求严格的场景,GPG验证是必须的。

4.2 从“手动下载”到“配置Yum仓库”

我们上面演示的是手动下载单个RPM包。在实际的运维中,如果服务器数量多,或者需要频繁升级,手动下载的方式效率低下。更优雅的做法是在服务器上直接配置官方的Yum仓库

这样,你就可以像安装系统软件一样使用yum install rabbitmq-server,并且能方便地进行yum update

配置RabbitMQ官方Yum仓库

  1. 下载仓库定义文件:

    sudo wget -O /etc/yum.repos.d/rabbitmq.repo https://packagecloud.io/rabbitmq/rabbitmq-server/el/7.repo

    (注意:RabbitMQ的仓库托管在packagecloud.io,上述是EL7的地址,其他版本需调整)

  2. 导入RabbitMQ的GPG密钥(如果仓库配置里没有自动包含):

    sudo rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey # 或者从其GitHub导入 sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
  3. 清理并重建Yum缓存:

    sudo yum clean all sudo yum makecache
  4. 此时,就可以搜索和安装了:

    sudo yum list available | grep rabbitmq sudo yum install -y rabbitmq-server

    Yum会自动解决Erlang依赖(通常是从RabbitMQ仓库或EPEL仓库安装)。

配置Erlang Solutions Yum仓库: 类似地,也可以配置Erlang的官方仓库,确保能安装到指定版本的Erlang。具体步骤参考Erlang Solutions官网的文档,通常涉及安装一个包含仓库配置的RPM包。

两种方式对比

方式优点缺点适用场景
手动下载.rpm版本控制绝对精准;离线环境可用;安装过程透明。依赖需手动解决;升级麻烦;多台服务器部署效率低。单次部署、特定版本要求、无外网或严格隔离的环境。
配置官方仓库安装升级极其方便;自动依赖解决;适合自动化运维。需要服务器能访问外网特定地址;受仓库中版本可用性限制。多服务器、需要持续更新、具备外网访问或内部镜像的环境。

5. 常见问题排查与运维技巧

即使按照步骤操作,也可能会遇到问题。这里记录几个我踩过的坑和解决方案。

5.1 服务启动失败排查

如果systemctl status rabbitmq-server显示失败,按以下顺序排查:

  1. 检查Erlang版本:这是最常见的问题。运行erl -version确认版本是否符合RabbitMQ要求。如果不符合,需要卸载错误版本的Erlang,安装正确版本。

    # 查看当前已安装的erlang包 rpm -qa | grep erlang # 卸载(注意包名可能不是‘esl-erlang’,可能是‘erlang’) sudo yum remove esl-erlang-...
  2. 检查日志:RabbitMQ的启动日志位于/var/log/rabbitmq/目录下,查看以rabbit@<hostname>开头并以.log结尾的最新文件。

    sudo tail -f /var/log/rabbitmq/rabbit@$(hostname -s).log

    常见的错误信息会直接打印在日志里,例如节点名冲突、Cookie文件问题、磁盘空间不足等。

  3. 检查Cookie文件:Erlang分布式节点通过一个共享的Cookie文件进行认证。RabbitMQ节点和rabbitmqctl工具必须使用相同的Cookie。

    • 文件路径:/var/lib/rabbitmq/.erlang.cookie
    • 该文件必须仅对所有者可读(权限400),且所有者必须是rabbitmq用户。
    sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
  4. 检查端口占用:RabbitMQ默认使用5672(AMQP)、15672(管理)等端口。确保这些端口没有被其他进程占用。

    sudo netstat -tlnp | grep -E ‘:5672|:15672’

5.2 性能与生产环境调优建议

安装成功只是第一步,要让RabbitMQ在生产环境稳定运行,还需要一些调优。

  1. 配置文件/etc/rabbitmq/rabbitmq.conf:这是一个主要的配置项来源(新版本格式)。你可以设置内存阈值、磁盘告警阈值、默认vhost等。

    # 示例:设置内存使用告警阈值为0.7(70%) # vm_memory_high_watermark.relative = 0.7 # 设置磁盘空闲空间告警阈值为1GB # disk_free_limit.absolute = 1GB

    建议从示例配置/usr/share/doc/rabbitmq-server-3.13.0/rabbitmq.conf.example复制一份进行修改。

  2. 环境变量文件/etc/rabbitmq/rabbitmq-env.conf:可以在这里设置节点名、配置文件路径、启动参数等。

    # 示例:设置节点名称 # NODENAME=rabbit@myhost # 指定Erlang虚拟机启动参数,例如增加内存分配 # ERL_ARGS=“+P 1000000 +K true +A 128”
  3. 启用持久化与确认机制:这是保证消息不丢失的关键。在生产者端发布消息时,设置delivery_mode=2(持久化);在声明队列时,设置durable=true;在消费者端,使用手动确认模式(auto_ack=false)。

  4. 监控:除了自带的管理界面,可以结合Prometheus + Grafana进行更专业的监控。RabbitMQ提供了 Prometheus插件 。

5.3 卸载与彻底清理

如果需要卸载,为了干净地重装,请按顺序执行:

# 1. 停止服务 sudo systemctl stop rabbitmq-server # 2. 卸载RabbitMQ软件包 sudo yum remove rabbitmq-server # 3. 卸载Erlang软件包 (谨慎操作,确保没有其他应用依赖它) sudo yum remove esl-erlang # 4. 手动删除残留数据和配置(非常重要!) sudo rm -rf /var/lib/rabbitmq/ sudo rm -rf /var/log/rabbitmq/ sudo rm -rf /etc/rabbitmq/

执行完这些,RabbitMQ和Erlang就从系统中被彻底清除了。下次安装就是一个全新的环境。