文章目录
- [Ubuntu 系统 RabbitMQ 安装指南与使用(含 C++ 客户端与 SSL 错误解决)](#Ubuntu 系统 RabbitMQ 安装指南与使用(含 C++ 客户端与 SSL 错误解决))
-
- [一、RabbitMQ 服务端安装与配置](#一、RabbitMQ 服务端安装与配置)
-
- [1.1 环境说明](#1.1 环境说明)
- [1.2 安装 RabbitMQ 服务端](#1.2 安装 RabbitMQ 服务端)
- [1.3 RabbitMQ 基础操作(服务管理)](#1.3 RabbitMQ 基础操作(服务管理))
- [1.4 用户配置(解决默认用户权限问题)](#1.4 用户配置(解决默认用户权限问题))
- [1.5 启用 Web 管理界面](#1.5 启用 Web 管理界面)
- [二、RabbitMQ 客户端库安装(C/C++)](#二、RabbitMQ 客户端库安装(C/C++))
-
- [2.1 安装依赖库](#2.1 安装依赖库)
- [2.2 安装 C 客户端库(rabbitmq-c)](#2.2 安装 C 客户端库(rabbitmq-c))
- [2.3 安装 C++ 客户端库(AMQP-CPP)](#2.3 安装 C++ 客户端库(AMQP-CPP))
- [三、常见错误:SSL 版本冲突解决](#三、常见错误:SSL 版本冲突解决)
-
- 错误原因
- [解决方案:修复 OpenSSL 安装](#解决方案:修复 OpenSSL 安装)
- 四、验证安装(可选)
- 总结
- [RabbitMQ 命令行工具](#RabbitMQ 命令行工具)
-
-
- 一、基础操作
-
- [1. 启动 / 停止 RabbitMQ 服务](#1. 启动 / 停止 RabbitMQ 服务)
- [2. 检查节点状态](#2. 检查节点状态)
- 二、用户管理
-
- [1. 列出所有用户](#1. 列出所有用户)
- [2. 创建用户](#2. 创建用户)
- [3. 删除用户](#3. 删除用户)
- [4. 修改用户密码](#4. 修改用户密码)
- [5. 设置用户角色](#5. 设置用户角色)
- 三、虚拟主机管理
-
- [1. 列出所有虚拟主机](#1. 列出所有虚拟主机)
- [2. 创建虚拟主机](#2. 创建虚拟主机)
- [3. 删除虚拟主机](#3. 删除虚拟主机)
- [4. 设置用户对虚拟主机的权限](#4. 设置用户对虚拟主机的权限)
- [5. 查看用户在虚拟主机的权限](#5. 查看用户在虚拟主机的权限)
- 四、交换机与队列管理
-
- [1. 列出交换机](#1. 列出交换机)
- [2. 列出队列](#2. 列出队列)
- [3. 删除队列](#3. 删除队列)
- [4. 清除队列消息](#4. 清除队列消息)
- 五、连接与通道管理
-
- [1. 列出连接](#1. 列出连接)
- [2. 关闭连接](#2. 关闭连接)
- [3. 列出通道](#3. 列出通道)
- 六、集群管理(高级)
-
- [1. 查看集群状态](#1. 查看集群状态)
- [2. 加入集群](#2. 加入集群)
- [3. 从集群移除节点](#3. 从集群移除节点)
- 七、其他常用命令
- 帮助与文档
-
Ubuntu 系统 RabbitMQ 安装指南与使用(含 C++ 客户端与 SSL 错误解决)
在消息队列领域,RabbitMQ 以其高可靠性、灵活的路由策略和跨语言支持,成为分布式系统中解耦服务的常用工具。本文将详细介绍 Ubuntu 系统下 RabbitMQ 的安装、基础配置、Web 管理界面启用,以及 C++ 客户端库(AMQP-CPP)的部署,并针对性解决安装中常见的 SSL 版本冲突问题。
一、RabbitMQ 服务端安装与配置
1.1 环境说明
- 系统版本:Ubuntu 20.04 / 22.04(LTS 版本兼容性最佳)
- 依赖:系统需联网,确保
apt
源更新正常
1.2 安装 RabbitMQ 服务端
RabbitMQ 依赖 Erlang 运行环境,但 Ubuntu 官方源中 rabbitmq-server
包已包含所需依赖,无需手动安装 Erlang,直接执行以下命令即可:
bash
# 更新 apt 源(可选,确保安装最新版本)
sudo apt update
# 安装 RabbitMQ 服务端
sudo apt install rabbitmq-server -y
安装完成后,系统会自动启动 RabbitMQ 服务,可通过以下命令验证状态:
bash
# 查看 RabbitMQ 服务状态
sudo systemctl status rabbitmq-server.service
若输出中包含 active (running)
,则表示服务启动成功。
1.3 RabbitMQ 基础操作(服务管理)
操作需求 | 命令 |
---|---|
启动服务 | sudo systemctl start rabbitmq-server.service |
停止服务 | sudo systemctl stop rabbitmq-server.service |
重启服务 | sudo systemctl restart rabbitmq-server.service |
设置开机自启(推荐) | sudo systemctl enable rabbitmq-server.service |
取消开机自启 | sudo systemctl disable rabbitmq-server.service |
1.4 用户配置(解决默认用户权限问题)
RabbitMQ 安装后默认创建 guest
用户,但该用户仅允许本地访问(localhost
),且权限有限。若需远程连接或完整操作权限,需创建自定义管理员用户:
-
添加用户 格式:
sudo rabbitmqctl add_user <用户名> <密码>
,示例:bashsudo rabbitmqctl add_user root 123456
-
设置用户角色为管理员 RabbitMQ 角色分为
administrator
(全权限)、monitoring
(监控权限)、policymaker
(策略配置权限)等,管理员需设置为administrator
:bashsudo rabbitmqctl set_user_tags root administrator
-
设置用户权限 赋予用户对所有虚拟主机(
/
为默认虚拟主机)的读写权限,格式:sudo rabbitmqctl set_permissions -p <虚拟主机> <用户名> <配置权限> <写权限> <读权限>
,示例:bashsudo rabbitmqctl set_permissions -p / root "." "." ".*"
- 权限说明:
"."
表示无配置权限,".*"
表示允许读写所有队列 / 交换机。
- 权限说明:
1.5 启用 Web 管理界面
RabbitMQ 提供可视化 Web 界面,方便管理队列、交换机、用户等,需手动启用插件:
bash
# 启用 Web 管理插件
sudo rabbitmq-plugins enable rabbitmq_management
启用后,通过浏览器访问 http://<服务器IP>:15672
,输入步骤 1.4 创建的用户名(如 root
)和密码(如 123456
),即可进入管理界面。
注意:若远程访问失败,需检查服务器防火墙是否开放 15672 端口(Web 界面端口)和 5672 端口(AMQP 协议默认端口),可通过以下命令开放端口:
bash# 开放 15672(Web)和 5672(AMQP)端口 sudo ufw allow 15672/tcp sudo ufw allow 5672/tcp # 重启防火墙生效 sudo ufw reload
二、RabbitMQ 客户端库安装(C/C++)
若需通过 C/C++ 代码操作 RabbitMQ,需安装底层 C 库和上层 C++ 库。本文选择主流的 rabbitmq-c
(C 库)和 AMQP-CPP
(C++ 库)。
2.1 安装依赖库
AMQP-CPP
依赖 libev
(事件驱动库)和 openssl
(SSL 加密库),先安装这些依赖:
bash
# 安装 libev 事件库
sudo apt install libev-dev -y
# 安装 openssl 库(用于 SSL 连接,默认系统可能已安装,此处确保版本兼容)
sudo apt install openssl libssl-dev -y
2.2 安装 C 客户端库(rabbitmq-c)
rabbitmq-c
是 RabbitMQ 官方推荐的 C 语言客户端库,为 C++ 库提供底层支持:
bash
# 克隆 rabbitmq-c 源码(也可从 GitHub 下载压缩包)
git clone https://github.com/alanxz/rabbitmq-c.git
# 进入源码目录,创建编译目录
cd rabbitmq-c
mkdir build && cd build
# 编译安装(使用 CMake)
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local # 指定安装路径为 /usr/local
make -j4 # 4 线程编译,可根据 CPU 核心数调整
sudo make install
2.3 安装 C++ 客户端库(AMQP-CPP)
AMQP-CPP
是基于 rabbitmq-c
的 C++ 封装库,API 更简洁,适合 C++ 项目开发:
bash
# 克隆 AMQP-CPP 源码
git clone https://github.com/CopernicaMarketingSoftware/AMQP-CPP.git
# 进入源码目录
cd AMQP-CPP
# 编译安装(AMQP-CPP 使用 Makefile,无需 CMake)
make -j4
sudo make install
安装完成后,库文件会默认安装到 /usr/local/lib
,头文件安装到 /usr/local/include
,后续 C++ 项目可通过 -lAMQP
链接该库。
三、常见错误:SSL 版本冲突解决
在安装 AMQP-CPP
时,可能出现以下 SSL 相关错误:
plaintext
/usr/include/openssl/macros.h:147:4: error: #error "OPENSSL_API_COMPAT expresses an impossible API compatibility level"
/usr/include/openssl/bio.h:687:1: error: expected constructor, destructor, or type conversion before 'DEPRECATEDIN_1_1_0'
错误原因
系统中 openssl
版本与 AMQP-CPP
预期的 API 兼容级别不匹配(如系统安装了 OpenSSL 3.0,而代码依赖 OpenSSL 1.1.x 的旧 API)。
解决方案:修复 OpenSSL 安装
通过强制卸载冲突的 SSL 组件,再重新安装兼容版本:
-
查看已安装的 SSL 相关包
bashdpkg -l | grep ssl
输出中可能包含
libssl-dev
、openssl
、libevent-openssl
等包。 -
强制卸载冲突包
bash# 强制卸载冲突的 SSL 相关包(根据实际输出调整包名) sudo dpkg -P --force-all libevent-openssl-2.1-7 openssl libssl-dev
--force-all
:强制卸载,忽略依赖关系(避免因依赖导致无法卸载)。
-
修复 apt 依赖并重新安装 SSL
bash# 修复 apt 依赖关系 sudo apt --fix-broken install -y # 重新安装兼容的 SSL 库 sudo apt install openssl libssl-dev -y
-
重新编译 AMQP-CPP 修复 SSL 后,回到
AMQP-CPP
源码目录,重新执行编译安装:bashcd AMQP-CPP # 进入之前的源码目录 make clean # 清除之前的编译残留 make -j4 sudo make install
四、验证安装(可选)
安装完成后,可通过简单的 C++ 代码验证客户端库是否可用(示例功能:连接 RabbitMQ 并创建一个队列):
cpp
#include <iostream>
#include <AMQP.h>
#include <ev.h>
// 事件循环(libev)
struct ev_loop* loop = ev_default_loop(0);
// 连接回调
void onConnected(AMQP::Connection* connection) {
std::cout << "Connected to RabbitMQ successfully!" << std::endl;
// 创建通道
AMQP::Channel* channel = connection->createChannel();
// 声明队列(队列名:test_queue,持久化:false,自动删除:false)
channel->declareQueue("test_queue", AMQP::durable(false), AMQP::autodelete(false))
.onSuccess([](const std::string& queueName, uint32_t messageCount, uint32_t consumerCount) {
std::cout << "Queue '" << queueName << "' declared successfully!" << std::endl;
});
}
// 错误回调
void onError(AMQP::Connection* connection, const char* message) {
std::cerr << "RabbitMQ error: " << message << std::endl;
ev_break(loop, EVBREAK_ALL); // 退出事件循环
}
int main() {
// 创建 TCP 连接(服务器 IP:127.0.0.1,端口:5672)
AMQP::TcpConnection connection(loop, AMQP::Address("amqp://root:123456@127.0.0.1:5672/"));
// 设置连接回调
connection.onConnected(onConnected);
connection.onError(onError);
// 启动事件循环
ev_run(loop, 0);
return 0;
}
编译与运行
将上述代码保存为 test_rabbitmq.cpp
,通过以下命令编译(链接 AMQP
、ev
、ssl
库):
bash
g++ test_rabbitmq.cpp -o test_rabbitmq -lAMQP -lev -lssl -lcrypto
运行程序,若输出 Connected to RabbitMQ successfully!
和 Queue 'test_queue' declared successfully!
,则表示客户端库安装正常,且能成功连接 RabbitMQ。
总结
本文从 RabbitMQ 服务端安装、用户配置、Web 管理界面启用,到 C/C++ 客户端库部署,再到 SSL 错误解决,覆盖了 Ubuntu 系统下 RabbitMQ 开发的完整流程。核心要点:
- 服务端需注意用户权限配置和端口开放,确保远程访问正常;
- 客户端依赖
libev
和openssl
,需提前安装; - SSL 版本冲突是常见坑,通过强制卸载 + 重新安装可解决;
- 安装后通过简单代码验证,确保库文件链接正常。
RabbitMQ 命令行工具
在 Ubuntu 系统中,rabbitmqctl
是 RabbitMQ 提供的命令行工具,用于管理 RabbitMQ 服务器(节点)、用户、虚拟主机、交换机、队列等核心组件。以下是其常用命令及详解:
一、基础操作
1. 启动 / 停止 RabbitMQ 服务
bash
# 启动服务
sudo systemctl start rabbitmq-server
# 停止服务
sudo systemctl stop rabbitmq-server
# 重启服务
sudo systemctl restart rabbitmq-server
# 查看服务状态
sudo systemctl status rabbitmq-server
2. 检查节点状态
bash
rabbitmqctl status
- 显示当前节点的详细状态(进程信息、内存使用、插件、集群状态等)。
二、用户管理
RabbitMQ 依赖用户进行权限控制,默认用户为 guest
(仅允许本地访问)。
1. 列出所有用户
bash
rabbitmqctl list_users
2. 创建用户
bash
rabbitmqctl add_user <用户名> <密码>
# 示例:创建用户 alice,密码 123456
rabbitmqctl add_user alice 123456
3. 删除用户
bash
rabbitmqctl delete_user <用户名>
4. 修改用户密码
bash
rabbitmqctl change_password <用户名> <新密码>
5. 设置用户角色
角色决定用户权限,常用角色:
administrator
:完全权限(管理所有资源)。monitoring
:监控权限(查看状态,无修改权限)。policymaker
:可管理策略。management
:仅可通过管理界面操作。- 空角色:仅能访问授权的虚拟主机。
bash
rabbitmqctl set_user_tags <用户名> <角色1> <角色2>...
# 示例:给 alice 分配管理员角色
rabbitmqctl set_user_tags alice administrator
三、虚拟主机管理
虚拟主机(vhost)用于隔离不同项目的资源(交换机、队列等),默认虚拟主机为 /
。
1. 列出所有虚拟主机
bash
rabbitmqctl list_vhosts
2. 创建虚拟主机
bash
rabbitmqctl add_vhost <vhost名称>
# 示例:创建 vhost myapp
rabbitmqctl add_vhost myapp
3. 删除虚拟主机
bash
rabbitmqctl delete_vhost <vhost名称>
4. 设置用户对虚拟主机的权限
权限格式:配置权限 写权限 读权限
,用正则表达式表示(.*
表示所有资源)。
bash
rabbitmqctl set_permissions -p <vhost名称> <用户名> <配置权限> <写权限> <读权限>
# 示例:允许 alice 对 myapp 虚拟主机有全部权限
rabbitmqctl set_permissions -p myapp alice ".*" ".*" ".*"
5. 查看用户在虚拟主机的权限
bash
rabbitmqctl list_permissions -p <vhost名称>
# 或查看指定用户的权限
rabbitmqctl list_user_permissions <用户名>
四、交换机与队列管理
1. 列出交换机
bash
rabbitmqctl list_exchanges -p <vhost名称>
# 可选参数:添加列(如 name, type, durable)
rabbitmqctl list_exchanges -p myapp name type durable
2. 列出队列
bash
rabbitmqctl list_queues -p <vhost名称>
# 常用列:name(名称)、messages(消息数)、durable(是否持久化)
rabbitmqctl list_queues -p myapp name messages durable
3. 删除队列
bash
rabbitmqctl delete_queue -p <vhost名称> <队列名>
# 强制删除(即使队列正在被使用)
rabbitmqctl delete_queue -p myapp myqueue --if-empty # 仅空队列
rabbitmqctl delete_queue -p myapp myqueue --if-unused # 仅未被使用的队列
4. 清除队列消息
bash
rabbitmqctl purge_queue -p <vhost名称> <队列名>
五、连接与通道管理
1. 列出连接
bash
rabbitmqctl list_connections
# 常用列:pid(进程ID)、user(用户)、vhost、address(客户端地址)
rabbitmqctl list_connections pid user vhost address
2. 关闭连接
bash
rabbitmqctl close_connection <连接PID> <关闭原因>
3. 列出通道
bash
rabbitmqctl list_channels
# 常用列:pid、user、vhost、consumer_count(消费者数)
六、集群管理(高级)
1. 查看集群状态
bash
rabbitmqctl cluster_status
2. 加入集群
在从节点执行(需先停止节点,重置数据):
bash
sudo systemctl stop rabbitmq-server
rabbitmqctl reset
rabbitmqctl join_cluster <主节点名称> # 主节点名称格式:rabbit@主机名
sudo systemctl start rabbitmq-server
3. 从集群移除节点
在主节点执行:
bash
rabbitmqctl forget_cluster_node <节点名称>
七、其他常用命令
-
启用插件(如管理界面插件):
bashrabbitmq-plugins enable rabbitmq_management
启用后可通过
http://localhost:15672
访问管理界面(默认用户guest/guest
)。 -
重置节点(清空所有数据,谨慎使用):
bashrabbitmqctl reset
-
强制同步镜像队列:
bashrabbitmqctl sync_queue <队列名> -p <vhost名称>
帮助与文档
- 查看所有命令:
rabbitmqctl help
- 查看具体命令帮助:
rabbitmqctl help <命令名>
(如rabbitmqctl help add_user
)