什么是 RabbitMQ?
简单说,RabbitMQ 是一个消息中间件,可以理解为 “消息邮局”:
当你的应用程序需要给另一个应用程序发送信息(比如订单通知、数据同步等),不需要直接 “面对面” 传递,而是通过 RabbitMQ 中转。
发送方把消息放进 RabbitMQ(相当于 “寄信”),接收方从 RabbitMQ 取消息(相当于 “收信”)。
这样即使接收方暂时故障,消息也不会丢失,等它恢复后再取走处理,保证了系统的稳定。
生产中 RabbitMQ 怎么工作?
举个例子:电商平台的 “下单流程”
用户在 APP 上下单(应用 A),需要通知库存系统减库存(应用 B)、支付系统生成账单(应用 C)。
应用 A 不用直接调用 B 和 C,而是把 “订单信息” 作为消息发给 RabbitMQ。
RabbitMQ 收到消息后,会暂存起来,然后分别推给正在 “监听” 的应用 B 和 C。
B 和 C 收到消息后,各自处理(减库存、生成账单),处理完后告诉 RabbitMQ “已完成”。
整个过程中,RabbitMQ 就像一个 “中转站”,解决了应用之间的直接依赖(比如 A 不用等 B 处理完再工作),也避免了某一个应用故障导致整个流程卡住。
RabbitMQ 与谁连接工作?
主要和各种应用程序连接,这些应用分为两类:
生产者:发送消息到 RabbitMQ 的应用(比如上面的下单 APP)。
消费者:从 RabbitMQ 接收消息的应用(比如上面的库存系统、支付系统)。
这些应用可以是不同语言开发的(Java、Python、Go 等),只要通过 RabbitMQ 提供的 “客户端库”(比如 Java 的 amqp-client、Python 的 pika),就能和 RabbitMQ 通信。
关于 Java 的说明:
提到 Java 的 amqp-client,并不是说连接 RabbitMQ 的机器必须安装 Java 服务。
客户端库(比如 amqp-client)是给Java 开发的应用程序用的 “工具包”,就像 Python 用 pika、Go 用 amqp 库一样。
比如:如果你的库存系统是用 Java 写的,那这个系统的代码里需要引入 amqp-client 库,才能和 RabbitMQ 通信;如果库存系统是 Python 写的,就用 pika 库,和机器上有没有 Java 没关系。
简单说:客户端库是 “应用程序代码里的工具”,和机器上安装什么语言的服务无关,只和应用程序本身的开发语言有关。
安装依赖
apt install -y curl gnupg apt-transport-https
安装 Erlang(RabbitMQ 依赖)
RabbitMQ 是基于 Erlang 开发的,需要先安装 Erlang 环境
添加Erlang仓库
curl -fsSL https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo gpg --dearmor -o /usr/share/keyrings/erlang-solutions-archive-keyring.gpg
【curl: (22) The requested URL returned error: 504】
【curl: (28) Failed to connect to github.com port 443 after 135364 ms: Couldn't connect to server
gpg: no valid OpenPGP data found.】
rm -f /usr/share/keyrings/erlang-solutions-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/erlang-solutions-archive-keyring.gpg] https://packages.erlang-solutions.com/ubuntu $(lsb_release -cs) contrib" | sudo tee /etc/apt/sources.list.d/erlang-solutions.list > /dev/null
【# 安装Erlang
sudo apt update
sudo apt install -y erlang】
换一种方式安装 Erlang(避开这个密钥问题):
直接使用 Ubuntu 默认仓库中的 Erlang 版本(兼容性有保障,适合生产环境):
更新仓库
sudo apt update
安装默认仓库的Erlang
sudo apt install -y erlang
验证 Erlang 是否安装成功:
erl -version
【# 添加RabbitMQ仓库
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-archive-keyring.gpg] https://packages.rabbitmq.com/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list > /dev/null
安装RabbitMQ
sudo apt update
sudo apt install -y rabbitmq-server】
手动下载密钥(推荐,避开服务器网络限制)
在本地电脑浏览器打开链接:
https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
gpg --dearmor -o /usr/share/keyrings/rabbitmq-archive-keyring.gpg ./rabbitmq-release-signing-key.asc
ls -lh /usr/share/keyrings/rabbitmq-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-archive-keyring.gpg] https://packages.rabbitmq.com/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list > /dev/null
执行完后apt update出错
【从输出可以看到,问题出在服务器无法解析 packages.rabbitmq.com 这个域名(Could not resolve 'packages.rabbitmq.com'),导致无法访问 RabbitMQ 的官方仓库。这通常是 DNS 解析问题】
nslookup packages.rabbitmq.com
修改服务器的 DNS 配置,使用公共 DNS(如阿里云 DNS、谷歌 DNS):
vim /etc/resolv.conf
nameserver 223.5.5.5 # 阿里云DNS
nameserver 8.8.8.8 # 谷歌DNS(备选)
apt update 后再次nslookup仍然不行
【从输出来看,即使更换了阿里云 DNS(223.5.5.5),仍然无法解析 packages.rabbitmq.com(NXDOMAIN 表示域名无解析记录),可能是该域名在当前网络环境中存在访问限制,或 DNS 缓存问题。此时直接绕开官方仓库,改用 国内镜像源 是更高效的解决方案,具体步骤如下:】
-
彻底删除原 RabbitMQ 官方仓库配置
避免后续更新时仍尝试访问无效的官方源:
sudo rm -f /etc/apt/sources.list.d/rabbitmq.list -
添加国内 RabbitMQ 镜像源(以阿里云镜像为例,稳定且国内访问快)
执行命令添加阿里云的 RabbitMQ 镜像仓库配置,同时关联之前已准备好的密钥:
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-archive-keyring.gpg] http://mirrors.aliyun.com/rabbitmq/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list > /dev/null
【# 如果阿里云镜像源仍有问题,也可尝试其他国内镜像源 华为云RabbitMQ镜像源】
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-archive-keyring.gpg] https://mirrors.huaweicloud.com/rabbitmq/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list > /dev/null
- 清除 APT 缓存并重新更新
清除旧缓存,避免残留的官方源信息干扰
apt clean && sudo apt autoclean
重新更新仓库索引(此时会访问阿里云镜像源)
apt update
从输出可以看到,阿里云的 RabbitMQ 镜像源没有针对你当前系统版本(noble,Ubuntu 24.04)的 Release 文件(404 错误),这是因为国内部分镜像源可能暂时未同步最新系统版本的仓库。
解决方法:直接使用 Ubuntu 系统默认仓库中的 RabbitMQ(无需额外配置第三方源,兼容性有保障),步骤如下:
-
删除无效的阿里云 RabbitMQ 仓库配置
sudo rm -f /etc/apt/sources.list.d/rabbitmq.list -
直接从系统默认仓库安装 RabbitMQ
buntu 默认仓库已包含 RabbitMQ,虽然版本可能不是最新,但稳定性经过验证,适合生产环境:
更新系统默认仓库
sudo apt update
安装默认仓库中的RabbitMQ
sudo apt install -y rabbitmq-server
检查服务状态
sudo systemctl status rabbitmq-server
若未启动,手动启动并设置开机自启
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
rabbitmq-plugins enable rabbitmq-management
【出现 {:plugins_not_found, [:"rabbitmq-management"]} 错误,说明系统中没有找到 rabbitmq-management 插件,通常是因为安装的 RabbitMQ 缺少对应的插件包。可以按以下步骤解决:】
- 安装 RabbitMQ 管理插件包
Ubuntu 系统中,管理插件通常在独立的 rabbitmq-server 包或额外的插件包中,执行以下命令确保相关组件安装完整:
重新安装 RabbitMQ 及其插件(确保包含管理插件)
sudo apt install -y --reinstall rabbitmq-server rabbitmq-server-core
出现 "Unable to locate package rabbitmq-server-core" 错误,说明系统的软件源中没有这个包(该包名可能已过时或不存在于当前 Ubuntu 版本的仓库中)。可以直接忽略这个包,专注于正确安装和启用管理插件:
仅重新安装 rabbitmq-server(它已包含核心组件):
sudo apt install -y --reinstall rabbitmq-server
确认管理插件是否在安装目录中:
查看 RabbitMQ 插件目录,确认管理插件存在:
ls -l /usr/lib/rabbitmq/lib/rabbitmq_server-*/plugins/ | grep management
启用管理插件(可选,提供Web管理界面)
sudo rabbitmq-plugins enable rabbitmq_management
创建管理员用户
sudo rabbitmqctl add_user admin your_strong_password
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin "." "." ".*"
(可选)删除默认guest用户(生产环境建议删除)
sudo rabbitmqctl delete_user guest
配置防火墙(如果需要远程访问)
允许RabbitMQ端口
sudo ufw allow 5672/tcp # AMQP协议端口
sudo ufw allow 15672/tcp # 管理界面端口
sudo ufw reload
http://x.x.x.x:15672 【5672】
查看版本
rabbitmqctl version
查看 Erlang 版本
rabbitmqctl status | grep "Erlang version"