Skip to content

RabbitMQ 管理界面(Management UI)

概述

RabbitMQ Management UI 是 RabbitMQ 提供的基于 Web 的图形化管理工具,通过直观的可视化界面,管理员可以轻松监控和管理 RabbitMQ 服务器、队列、交换器、绑定关系、用户权限等。

管理界面由 rabbitmq_management 插件提供,是 RabbitMQ 最常用的管理工具之一。

核心功能

1. 仪表盘概览

  • 全局统计:显示消息速率、队列数量、连接数、通道数等关键指标
  • 节点信息:查看集群中各节点的状态、资源使用情况
  • 实时监控:动态更新的图表和数据

2. 连接管理

  • 查看所有客户端连接
  • 监控连接状态和流量
  • 强制关闭连接

3. 通道管理

  • 查看所有通道及其状态
  • 监控通道的消费者数量
  • 查看通道的未确认消息数

4. 交换器管理

  • 创建、删除、查看交换器
  • 发布测试消息
  • 查看绑定关系

5. 队列管理

  • 创建、删除、清空队列
  • 查看队列详情(消息数、消费者数等)
  • 获取队列中的消息(用于调试)
  • 设置队列策略

6. 用户与权限管理

  • 创建、删除用户
  • 设置用户标签(管理员、监控者等)
  • 配置虚拟主机权限

7. 策略管理

  • 创建和管理策略
  • 应用 HA 策略
  • 设置队列和交换器的参数

访问管理界面

启用管理插件

bash
# 启用管理插件
rabbitmq-plugins enable rabbitmq_management

# 检查插件状态
rabbitmq-plugins list | grep management

默认访问地址

http://localhost:15672

默认用户凭据

用户名: guest
密码: guest

注意:默认的 guest/guest 账户只能从 localhost 访问。远程访问需要创建新用户。

创建管理员用户

bash
# 创建用户
rabbitmqctl add_user admin your_password

# 设置用户标签为管理员
rabbitmqctl set_user_tags admin administrator

# 授予所有虚拟主机的完整权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

界面详细使用

登录界面

【截图位置:登录页面】

  • 输入用户名和密码
  • 点击 "Login" 按钮进入管理界面

主页仪表盘

【截图位置:主页仪表盘】

  • Queued messages:队列中的消息总数
  • Message rates:消息速率图表
  • Global counts:连接、通道、交换器、队列的全局计数

关键指标说明

指标说明
Ready等待被消费的消息数
Unacked已投递但未确认的消息数
Total消息总数 (Ready + Unacked)
Publish消息发布速率
Deliver消息投递速率
Ack消息确认速率

连接管理页面

【截图位置:Connections 标签页】

查看连接列表

导航路径:AdminConnections

显示信息:

  • User:连接用户
  • Peer host:客户端 IP
  • Peer port:客户端端口
  • State:连接状态
  • SSL:是否使用 SSL

连接详情

点击连接名称可查看:

  • 客户端信息(版本、协议等)
  • 认证信息
  • 网络统计
  • 通道列表

关闭连接

  1. 点击连接名称进入详情页
  2. 点击 "Close connection" 按钮
  3. 确认关闭操作

通道管理页面

【截图位置:Channels 标签页】

导航路径:AdminChannels

显示信息:

  • Channel:通道名称
  • User:所属用户
  • Mode:确认模式
  • Unacked:未确认消息数
  • Publish:发布速率
  • Confirm:确认速率

交换器管理页面

【截图位置:Exchanges 标签页】

导航路径:Exchanges

查看交换器列表

  • 显示所有虚拟主机中的交换器
  • 内置交换器以 (AMQP default) 标注

创建交换器

  1. 点击 "Add a new exchange" 链接
  2. 填写表单:
    • Name:交换器名称
    • Type:类型(direct/topic/fanout/headers)
    • Durability:持久化选项
    • Auto delete:自动删除
    • Internal:是否为内部交换器
  3. 点击 "Add exchange" 按钮

发布测试消息

  1. 点击交换器名称进入详情
  2. 展开 "Publish message" 部分
  3. 填写:
    • Routing key:路由键
    • Payload:消息内容
    • Properties:消息属性(JSON 格式)
  4. 点击 "Publish message" 按钮

队列管理页面

【截图位置:Queues 标签页】

导航路径:Queues

查看队列列表

显示信息:

  • Name:队列名称
  • Features:队列特性(D=持久化, TTL 等)
  • State:运行状态
  • Ready:待消费消息数
  • Unacked:未确认消息数
  • Total:消息总数
  • incoming:入队速率
  • deliver/get:出队速率
  • ack:确认速率

创建队列

  1. 点击 "Add a new queue" 链接
  2. 填写表单:
    • Name:队列名称
    • Type:队列类型(classic/quorum/stream)
    • Durability:持久化选项
    • Auto delete:自动删除
    • Arguments:队列参数
  3. 点击 "Add queue" 按钮

常用队列参数

参数说明示例值
x-message-ttl消息 TTL(毫秒)60000
x-expires队列过期时间(毫秒)3600000
x-max-length最大消息数10000
x-max-length-bytes最大字节数10485760
x-dead-letter-exchange死信交换器dlx.exchange
x-dead-letter-routing-key死信路由键dlx.routing.key

获取队列消息

  1. 点击队列名称进入详情
  2. 展开 "Get messages" 部分
  3. 设置:
    • Ack mode:确认模式
      • Nack message requeue true:不确认,重新入队
      • Automatic ack:自动确认
      • Reject requeue true:拒绝并重新入队
      • Reject requeue false:拒绝并丢弃
    • Encoding:编码方式
    • Messages:获取数量
  4. 点击 "Get Message(s)" 按钮

清空队列

  1. 点击队列名称进入详情
  2. 点击 "Purge Messages" 按钮
  3. 确认清空操作

删除队列

  1. 点击队列名称进入详情
  2. 点击 "Delete" 按钮
  3. 确认删除操作

用户管理页面

【截图位置:Admin → Users 标签页】

导航路径:AdminUsers

查看用户列表

显示信息:

  • Name:用户名
  • Tags:用户标签
  • Can access virtual hosts:可访问的虚拟主机

创建用户

  1. 点击 "Add a user" 链接
  2. 填写表单:
    • Username:用户名
    • Password:密码
    • Tags:用户标签
  3. 点击 "Add user" 按钮

用户标签说明

标签权限
administrator完全管理权限
monitoring可查看所有配置和统计信息
policymaker可查看所有配置并管理策略
management可查看自己有权限的虚拟主机
(无标签)无管理界面访问权限

设置权限

  1. 点击用户名进入详情
  2. 在 "Permissions" 部分:
    • Virtual host:选择虚拟主机
    • Configure:配置权限正则
    • Write:写入权限正则
    • Read:读取权限正则
  3. 点击 "Set permission" 按钮

权限正则示例

".*"        # 匹配所有资源
"^queue\."  # 匹配以 "queue." 开头的资源
"^test\."   # 匹配以 "test." 开头的资源
""          # 无权限

虚拟主机管理

【截图位置:Admin → Virtual Hosts 标签页】

导航路径:AdminVirtual Hosts

创建虚拟主机

  1. 点击 "Add a new virtual host" 链接
  2. 输入虚拟主机名称
  3. 点击 "Add virtual host" 按钮

策略管理

【截图位置:Admin → Policies 标签页】

导航路径:AdminPolicies

创建策略

  1. 点击 "Add / update a policy" 链接
  2. 填写表单:
    • Name:策略名称
    • Pattern:匹配模式(正则表达式)
    • Apply to:应用对象(Queues/Exchanges/All)
    • Priority:优先级
    • Definition:策略定义(JSON 格式)
  3. 点击 "Add / update policy" 按钮

常用策略示例

HA 策略(镜像队列)

json
{
  "ha-mode": "all",
  "ha-sync-mode": "automatic"
}

队列 TTL 策略

json
{
  "message-ttl": 86400000
}

最大长度策略

json
{
  "max-length": 10000,
  "overflow": "reject-publish-dlx"
}

PHP 代码示例

通过 API 创建用户

php
<?php

class RabbitMQManager
{
    private $host;
    private $port;
    private $user;
    private $password;

    public function __construct($host = 'localhost', $port = 15672, $user = 'admin', $password = 'admin')
    {
        $this->host = $host;
        $this->port = $port;
        $this->user = $user;
        $this->password = $password;
    }

    private function request($method, $path, $data = null)
    {
        $url = "http://{$this->host}:{$this->port}/api/{$path}";
        
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_USERPWD => "{$this->user}:{$this->password}",
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_CUSTOMREQUEST => $method,
        ]);
        
        if ($data !== null) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return [
            'code' => $httpCode,
            'body' => json_decode($response, true)
        ];
    }

    public function createUser($username, $password, $tags = '')
    {
        $data = [
            'password' => $password,
            'tags' => $tags
        ];
        
        return $this->request('PUT', "users/{$username}", $data);
    }

    public function setPermissions($username, $vhost, $configure = '.*', $write = '.*', $read = '.*')
    {
        $data = [
            'configure' => $configure,
            'write' => $write,
            'read' => $read
        ];
        
        return $this->request('PUT', "permissions/{$vhost}/{$username}", $data);
    }

    public function createQueue($name, $vhost = '%2F', $arguments = [])
    {
        $data = [
            'auto_delete' => false,
            'durable' => true,
            'arguments' => $arguments
        ];
        
        return $this->request('PUT', "queues/{$vhost}/{$name}", $data);
    }

    public function createExchange($name, $type, $vhost = '%2F')
    {
        $data = [
            'type' => $type,
            'auto_delete' => false,
            'durable' => true
        ];
        
        return $this->request('PUT', "exchanges/{$vhost}/{$name}", $data);
    }

    public function createBinding($exchange, $queue, $routingKey, $vhost = '%2F')
    {
        $data = [
            'routing_key' => $routingKey,
            'destination' => $queue,
            'destination_type' => 'queue'
        ];
        
        return $this->request('POST', "bindings/{$vhost}/e/{$exchange}/q/{$queue}", $data);
    }

    public function getQueueInfo($name, $vhost = '%2F')
    {
        return $this->request('GET', "queues/{$vhost}/{$name}");
    }

    public function purgeQueue($name, $vhost = '%2F')
    {
        return $this->request('DELETE', "queues/{$vhost}/{$name}/contents");
    }

    public function getOverview()
    {
        return $this->request('GET', 'overview');
    }

    public function getNodes()
    {
        return $this->request('GET', 'nodes');
    }

    public function getConnections()
    {
        return $this->request('GET', 'connections');
    }

    public function closeConnection($name)
    {
        return $this->request('DELETE', "connections/{$name}");
    }
}

$manager = new RabbitMQManager('localhost', 15672, 'admin', 'admin123');

$result = $manager->createUser('app_user', 'secure_password', 'monitoring');
echo "创建用户结果: HTTP {$result['code']}\n";

$result = $manager->setPermissions('app_user', '/', '^app\.', '^app\.', '^app\.');
echo "设置权限结果: HTTP {$result['code']}\n";

$result = $manager->createQueue('app.orders', '%2F', ['x-message-ttl' => 86400000]);
echo "创建队列结果: HTTP {$result['code']}\n";

$result = $manager->createExchange('app.exchange', 'topic');
echo "创建交换器结果: HTTP {$result['code']}\n";

$result = $manager->createBinding('app.exchange', 'app.orders', 'order.*');
echo "创建绑定结果: HTTP {$result['code']}\n";

$overview = $manager->getOverview();
echo "队列总数: {$overview['body']['object_totals']['queues']}\n";
echo "连接总数: {$overview['body']['object_totals']['connections']}\n";

监控脚本示例

php
<?php

class RabbitMQMonitor
{
    private $manager;
    private $alertThresholds;

    public function __construct(RabbitMQManager $manager)
    {
        $this->manager = $manager;
        $this->alertThresholds = [
            'queue_messages' => 10000,
            'consumer_count' => 1,
            'connection_count' => 100
        ];
    }

    public function checkQueueHealth($queueName, $vhost = '%2F')
    {
        $result = $this->manager->getQueueInfo($queueName, $vhost);
        
        if ($result['code'] !== 200) {
            return [
                'status' => 'error',
                'message' => "无法获取队列信息: HTTP {$result['code']}"
            ];
        }
        
        $queue = $result['body'];
        $alerts = [];
        
        if ($queue['messages'] > $this->alertThresholds['queue_messages']) {
            $alerts[] = "队列消息数超过阈值: {$queue['messages']} > {$this->alertThresholds['queue_messages']}";
        }
        
        if ($queue['consumers'] < $this->alertThresholds['consumer_count']) {
            $alerts[] = "消费者数量不足: {$queue['consumers']} < {$this->alertThresholds['consumer_count']}";
        }
        
        return [
            'status' => empty($alerts) ? 'healthy' : 'warning',
            'queue' => $queueName,
            'messages' => $queue['messages'],
            'consumers' => $queue['consumers'],
            'alerts' => $alerts
        ];
    }

    public function checkSystemHealth()
    {
        $overview = $this->manager->getOverview();
        
        if ($overview['code'] !== 200) {
            return ['status' => 'error', 'message' => '无法连接到 RabbitMQ'];
        }
        
        $data = $overview['body'];
        $alerts = [];
        
        $connections = $data['object_totals']['connections'];
        if ($connections > $this->alertThresholds['connection_count']) {
            $alerts[] = "连接数过多: {$connections}";
        }
        
        return [
            'status' => empty($alerts) ? 'healthy' : 'warning',
            'connections' => $connections,
            'channels' => $data['object_totals']['channels'],
            'queues' => $data['object_totals']['queues'],
            'exchanges' => $data['object_totals']['exchanges'],
            'alerts' => $alerts
        ];
    }

    public function generateReport()
    {
        $health = $this->checkSystemHealth();
        
        $report = "=== RabbitMQ 健康报告 ===\n";
        $report .= "时间: " . date('Y-m-d H:i:s') . "\n";
        $report .= "状态: {$health['status']}\n";
        $report .= "连接数: {$health['connections']}\n";
        $report .= "通道数: {$health['channels']}\n";
        $report .= "队列数: {$health['queues']}\n";
        $report .= "交换器数: {$health['exchanges']}\n";
        
        if (!empty($health['alerts'])) {
            $report .= "\n警告:\n";
            foreach ($health['alerts'] as $alert) {
                $report .= "  - {$alert}\n";
            }
        }
        
        return $report;
    }
}

$manager = new RabbitMQManager('localhost', 15672, 'admin', 'admin123');
$monitor = new RabbitMQMonitor($manager);

$queueHealth = $monitor->checkQueueHealth('app.orders');
print_r($queueHealth);

echo $monitor->generateReport();

实际应用场景

场景一:开发调试

开发过程中需要查看消息内容:

  1. 打开管理界面
  2. 导航到目标队列
  3. 使用 "Get messages" 功能查看消息
  4. 分析消息格式和内容

场景二:生产监控

实时监控生产环境:

  1. 查看仪表盘的消息积压情况
  2. 检查消费者连接状态
  3. 监控消息速率变化
  4. 发现异常及时告警

场景三:问题排查

当消息处理出现问题时:

  1. 查看队列消息积压情况
  2. 检查消费者数量
  3. 查看通道的未确认消息数
  4. 检查连接状态

场景四:权限管理

为新项目配置访问权限:

  1. 创建专用用户
  2. 创建虚拟主机
  3. 配置用户权限
  4. 分发给开发团队

常见问题与解决方案

问题一:无法访问管理界面

原因

  • 管理插件未启用
  • 防火墙阻止 15672 端口
  • 用户权限不足

解决方案

bash
# 启用管理插件
rabbitmq-plugins enable rabbitmq_management

# 检查端口
netstat -tlnp | grep 15672

# 创建管理员用户
rabbitmqctl add_user admin password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

问题二:guest 用户无法远程登录

原因:默认安全限制,guest 用户只能本地访问

解决方案:创建新用户并授予管理员权限

bash
rabbitmqctl add_user admin your_password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

问题三:界面加载缓慢

原因

  • 统计数据量大
  • 队列数量过多
  • 网络延迟

解决方案

  1. 减少采样率
  2. 清理无用队列
  3. 使用 API 直接获取数据

问题四:无法删除队列

原因:队列正在被使用或有策略保护

解决方案

  1. 先关闭所有消费者
  2. 检查并移除相关策略
  3. 使用命令行强制删除
bash
rabbitmqctl delete_queue queue_name

最佳实践建议

1. 安全配置

  • 禁用或修改 guest 用户密码
  • 为不同应用创建独立用户
  • 使用最小权限原则
  • 启用 HTTPS(生产环境)

2. 监控策略

  • 定期检查队列积压
  • 设置消费者数量告警
  • 监控连接数变化
  • 记录关键指标历史

3. 用户管理

  • 按项目划分用户
  • 使用虚拟主机隔离
  • 定期审计用户权限
  • 及时清理废弃账户

4. 性能优化

  • 避免频繁刷新页面
  • 使用 API 批量操作
  • 合理设置队列 TTL
  • 定期清理无用资源

5. 运维建议

  • 建立监控告警机制
  • 定期备份配置
  • 记录变更操作
  • 制定应急预案

相关链接