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 logrotatewget:用于从网络下载文件。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包。
确定包名:Erlang RPM包命名通常有固定模式,例如:
esl-erlang_26.2.1-1~centos~7_amd64.rpm。其中esl-erlang是包名,26.2.1是版本,1是发布版本号,centos~7指代系统,amd64是架构。执行下载:我们可以使用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。
- 执行下载:
# 继续在 /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.rpmnoarch表示这个包是架构无关的,因为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.1或libstdc++等),不要慌张。这通常是因为系统自带的库版本过低。
解决方案:
- 方案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 -yyum 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.rpmyum 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 管理服务与基础配置
启动服务并设置开机自启:
sudo systemctl daemon-reload # 重新加载Systemd配置 sudo systemctl enable rabbitmq-server # 启用开机自启 sudo systemctl start rabbitmq-server # 启动服务 sudo systemctl status rabbitmq-server # 检查状态看到
active (running)状态即为成功。启用Web管理插件:RabbitMQ自带一个基于Web的管理控制台,非常方便。
sudo rabbitmq-plugins enable rabbitmq_management执行后,会提示安装一些依赖插件(如
cowboy,rabbitmq_web_dispatch等),确认即可。创建管理用户:默认的
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以交互方式输入密码,避免在命令行历史中留下明文密码。访问管理界面:打开浏览器,访问
http://<你的服务器IP>:15672。使用上面创建的admin账号登录。
4. 深入解析:GPG验证与仓库化安装
4.1 为什么要进行GPG验证?
直接从网上下载二进制包安装,存在被篡改的风险。GPG(GNU Privacy Guard)签名验证可以确保你下载的软件包确实来自官方,且未被中间人修改。这是一种重要的安全实践。
RabbitMQ和Erlang的GPG密钥验证流程:
- 导入公钥:首先需要将软件官方的GPG公钥导入到系统的RPM密钥环中。
- 验证签名:在安装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.rpmdigests signatures OK或gpg OK字样。
对于Erlang Solutions的包,过程类似,需要从其官网找到对应的公钥进行导入。虽然手动安装时有时会跳过这一步,但对于生产环境,尤其是安全要求严格的场景,GPG验证是必须的。
4.2 从“手动下载”到“配置Yum仓库”
我们上面演示的是手动下载单个RPM包。在实际的运维中,如果服务器数量多,或者需要频繁升级,手动下载的方式效率低下。更优雅的做法是在服务器上直接配置官方的Yum仓库。
这样,你就可以像安装系统软件一样使用yum install rabbitmq-server,并且能方便地进行yum update。
配置RabbitMQ官方Yum仓库:
下载仓库定义文件:
sudo wget -O /etc/yum.repos.d/rabbitmq.repo https://packagecloud.io/rabbitmq/rabbitmq-server/el/7.repo(注意:RabbitMQ的仓库托管在packagecloud.io,上述是EL7的地址,其他版本需调整)
导入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清理并重建Yum缓存:
sudo yum clean all sudo yum makecache此时,就可以搜索和安装了:
sudo yum list available | grep rabbitmq sudo yum install -y rabbitmq-serverYum会自动解决Erlang依赖(通常是从RabbitMQ仓库或EPEL仓库安装)。
配置Erlang Solutions Yum仓库: 类似地,也可以配置Erlang的官方仓库,确保能安装到指定版本的Erlang。具体步骤参考Erlang Solutions官网的文档,通常涉及安装一个包含仓库配置的RPM包。
两种方式对比:
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 手动下载.rpm | 版本控制绝对精准;离线环境可用;安装过程透明。 | 依赖需手动解决;升级麻烦;多台服务器部署效率低。 | 单次部署、特定版本要求、无外网或严格隔离的环境。 |
| 配置官方仓库 | 安装升级极其方便;自动依赖解决;适合自动化运维。 | 需要服务器能访问外网特定地址;受仓库中版本可用性限制。 | 多服务器、需要持续更新、具备外网访问或内部镜像的环境。 |
5. 常见问题排查与运维技巧
即使按照步骤操作,也可能会遇到问题。这里记录几个我踩过的坑和解决方案。
5.1 服务启动失败排查
如果systemctl status rabbitmq-server显示失败,按以下顺序排查:
检查Erlang版本:这是最常见的问题。运行
erl -version确认版本是否符合RabbitMQ要求。如果不符合,需要卸载错误版本的Erlang,安装正确版本。# 查看当前已安装的erlang包 rpm -qa | grep erlang # 卸载(注意包名可能不是‘esl-erlang’,可能是‘erlang’) sudo yum remove esl-erlang-...检查日志:RabbitMQ的启动日志位于
/var/log/rabbitmq/目录下,查看以rabbit@<hostname>开头并以.log结尾的最新文件。sudo tail -f /var/log/rabbitmq/rabbit@$(hostname -s).log常见的错误信息会直接打印在日志里,例如节点名冲突、Cookie文件问题、磁盘空间不足等。
检查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- 文件路径:
检查端口占用:RabbitMQ默认使用5672(AMQP)、15672(管理)等端口。确保这些端口没有被其他进程占用。
sudo netstat -tlnp | grep -E ‘:5672|:15672’
5.2 性能与生产环境调优建议
安装成功只是第一步,要让RabbitMQ在生产环境稳定运行,还需要一些调优。
配置文件
/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复制一份进行修改。环境变量文件
/etc/rabbitmq/rabbitmq-env.conf:可以在这里设置节点名、配置文件路径、启动参数等。# 示例:设置节点名称 # NODENAME=rabbit@myhost # 指定Erlang虚拟机启动参数,例如增加内存分配 # ERL_ARGS=“+P 1000000 +K true +A 128”启用持久化与确认机制:这是保证消息不丢失的关键。在生产者端发布消息时,设置
delivery_mode=2(持久化);在声明队列时,设置durable=true;在消费者端,使用手动确认模式(auto_ack=false)。监控:除了自带的管理界面,可以结合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就从系统中被彻底清除了。下次安装就是一个全新的环境。
