Ubuntu 系统 RabbitMQ 安装指南与使用(含 C++ 客户端与 SSL 错误解决)

文章目录

  • [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),且权限有限。若需远程连接或完整操作权限,需创建自定义管理员用户:

  1. 添加用户 格式:sudo rabbitmqctl add_user <用户名> <密码>,示例:

    bash 复制代码
    sudo rabbitmqctl add_user root 123456
  2. 设置用户角色为管理员 RabbitMQ 角色分为 administrator(全权限)、monitoring(监控权限)、policymaker(策略配置权限)等,管理员需设置为 administrator

    bash 复制代码
    sudo rabbitmqctl set_user_tags root administrator
  3. 设置用户权限 赋予用户对所有虚拟主机(/ 为默认虚拟主机)的读写权限,格式:sudo rabbitmqctl set_permissions -p <虚拟主机> <用户名> <配置权限> <写权限> <读权限>,示例:

    bash 复制代码
    sudo 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 组件,再重新安装兼容版本:

  1. 查看已安装的 SSL 相关包

    bash 复制代码
    dpkg -l | grep ssl

    输出中可能包含 libssl-devopenssllibevent-openssl 等包。

  2. 强制卸载冲突包

    bash 复制代码
    # 强制卸载冲突的 SSL 相关包(根据实际输出调整包名)
    sudo dpkg -P --force-all libevent-openssl-2.1-7 openssl libssl-dev
    • --force-all:强制卸载,忽略依赖关系(避免因依赖导致无法卸载)。
  3. 修复 apt 依赖并重新安装 SSL

    bash 复制代码
    # 修复 apt 依赖关系
    sudo apt --fix-broken install -y
    
    # 重新安装兼容的 SSL 库
    sudo apt install openssl libssl-dev -y
  4. 重新编译 AMQP-CPP 修复 SSL 后,回到 AMQP-CPP 源码目录,重新执行编译安装:

    bash 复制代码
    cd 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,通过以下命令编译(链接 AMQPevssl 库):

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 开发的完整流程。核心要点:

  1. 服务端需注意用户权限配置和端口开放,确保远程访问正常;
  2. 客户端依赖 libevopenssl,需提前安装;
  3. SSL 版本冲突是常见坑,通过强制卸载 + 重新安装可解决;
  4. 安装后通过简单代码验证,确保库文件链接正常。

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 <节点名称>

七、其他常用命令

  1. 启用插件(如管理界面插件):

    bash 复制代码
    rabbitmq-plugins enable rabbitmq_management

    启用后可通过 http://localhost:15672 访问管理界面(默认用户 guest/guest)。

  2. 重置节点(清空所有数据,谨慎使用):

    bash 复制代码
    rabbitmqctl reset
  3. 强制同步镜像队列

    bash 复制代码
    rabbitmqctl sync_queue <队列名> -p <vhost名称>

帮助与文档

  • 查看所有命令:rabbitmqctl help
  • 查看具体命令帮助:rabbitmqctl help <命令名>(如 rabbitmqctl help add_user
相关推荐
Mr.45673 小时前
RabbitMQ消息传输中Protostuff序列化数据异常的深度解析与解决方案
rabbitmq
WindrunnerMax4 小时前
从零实现富文本编辑器#8-浏览器输入模式的非受控DOM行为
前端·前端框架·github
草莓熊Lotso4 小时前
《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》
前端·c++·python·dubbo
这周也會开心4 小时前
通过ssh连接GitHub远程仓库
运维·ssh·github
东巴图4 小时前
分解如何利用c++修复小程序的BUG
开发语言·c++·bug
祁同伟.4 小时前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
恒者走天下4 小时前
AI智能网络检测项目(cpp c++项目)更新
开发语言·c++
不会写DN5 小时前
用户头像文件存储功能是如何实现的?
java·linux·后端·golang·node.js·github