四、RabbitMQ 快速使用 - RabbitMQ 管理之 vhost

作者: 温新

分类: 【PHP RabbitMQ】

阅读: 1226

时间: 2023-02-27 07:19:27

hi,我是温新,一名 PHPer

版本:erlang-25.2.1、rabbitmq_server-3.11.9

系统版本:Rocky Linux 9.1

学习目标:掌握 vhost 相关操作

本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!

每一个 RabbitMQ 服务器都能创建虚拟消息服务器 ,即虚拟主机(Virtual host),简称 vhost。

vhost 本质是一个独立的小型 RabbitMQ 服务器,拥有自己对立的队列、交换器、绑定关系等,耐用还拥有自己独立的权限。

每个 vhost 之间都是绝对隔壁的,因此可以避免队列和交换机等命名冲突。举例来说 ,无法把 vhost1 中的交换机与 vhost2 中的队列进行绑定。

使用 RabbitMQ 时,可以基于业务功能设置不同的场景区分并独立配置 vhost。

vhost 是 AMQP 概念的基础,客户端连接服务器必须指定一个 vhost。若没有指定 vhost 时,会连接默认的 vhost /

创建 vhost

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">add_vhost</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">虚拟主机名</span></span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 添加虚拟主机</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">add_vhost</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sms</span></span>

查看 vhost

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_vhosts</span> [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">vhostinfoitem</span>...]</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 参数说明:</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># name: vhost 名称</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># tracing:表示是否使用了 RabbitMQ 的 trace 功能</span></span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 方式一</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_vhosts</span></span><br></br> <br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 方式二</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_vhosts</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">name</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">tracing</span></span>

删除 vhost

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">delete_vhost</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">虚拟主机名</span></span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">delete_vhost</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sms</span></span>

删除一个 vhost ,同时也会删除下面的队列、交换器、绑定关系、用户权限、参数和策略等信息。

权限配置(set_premissions)

AMQP 协议中并没有指定权限在 vhost 级别还是在服务器级别实现,由具体的应用自定义。

在 RabbitMQ 中,权限以 vhost 为单位。在 创建一个用户时,用户通常会被 指派给至少一个 vhost,意味着该用户只能访问被指派的 vhost 内的资源。

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">set_permissions</span> [<span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">vhost</span>] {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">user</span>} {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">conf</span>} {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">write</span>} {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">read</span>}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 参数说明</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># -p vhost:给哪一个 vhost 授权用户访问权限</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># user:给哪一个用户指定权限</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># conf:用于匹配用户在哪些资源上拥有可配置权限的正则表达式;指:队列和交换器的创建及删除之类的操作</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># write:用于匹配用户在哪些资源上拥有可写权限的正则表达式;指:发布消息</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># read:用于匹配用户在哪些资源上拥有可读权限的正则表达式;指:与消息有关的操作,包括读取消息及清空整个队列等</span></span>

AMQP 命令列表与对应的权限:

配置权限案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 授予 test 用户可以访问虚拟主机 sms;</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 并且在所有资源上具有可配置、可写、可读权限</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">set_permissions</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sms</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">test</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">".*"</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">".*"</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">".*"</span></span>

查看 vhost 权限

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_permissions</span> [<span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">vhost</span>]</span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_permissions</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sms</span></span>

查看用户权限

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_user_permissions</span> {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">username</span>}</span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">list_user_permissions</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">test</span></span>

删除用户权限

语法

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">clear_permissions</span> [<span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">vhost</span>] {<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">username</span>}</span>

案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">rabbitmqctl</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">clear_permissions</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">p</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sms</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">test</span></span>
请登录后再评论