管理插件
概述
RabbitMQ 管理插件提供了一个基于 HTTP 的 API,用于管理和 监控 RabbitMQ 节点和集群,同时还提供了一个基于浏览器的 UI 和一个命令行工具,名为 rabbitmqadmin。
它会定期收集和聚合有关系统多个方面的数据。这些指标在 UI 中向操作员展示。它提供的 API 可用于 监控系统,然而,对于长期存储、告警、可视化、图表分析等,Prometheus 是推荐选项。
该插件还提供了用于 分析节点内存使用 的工具,以及与监控、指标、用户、权限和拓扑管理相关的其他功能。之前它还提供了 定义导出和导入功能。这些现在是 RabbitMQ 的核心功能,不需要或依赖此插件。
本指南涵盖
- 管理 UI 的基本用法
- 管理插件提供的 HTTP API
- 通用插件 配置
- HTTP API 前置的 反向代理(Nginx 或 Apache)
- 如何为管理 UI 及其底层 API 启用 HTTPS
- 该插件如何在多节点集群中 运行
- 如何 禁用指标收集,以便仅使用 Prometheus 进行监控
- 如何创建 一个仅用于监控目的且权限受限的用户
- 使用 OAuth 2 进行身份验证
- 严格传输安全、内容安全策略、跨域资源共享 和 其他安全相关标头 控制
- 统计信息收集间隔
- 消息速率模式(速率保真度)和 数据保留间隔
- HTTP API 请求日志记录
- 如何设置 管理 UI 登录会话超时
- 如何 重置此插件使用的统计数据库
该插件还提供了扩展点,供 rabbitmq-top 或 rabbitmq-shovel-management 等插件用来扩展 UI。
管理 UI 和外部监控系统
尽可能优先使用外部监控选项。基础设施和内核级监控 在任何生产系统中也至关重要。
管理 UI 及其 HTTP API 是 RabbitMQ 的内置 监控选项。对于开发以及在难以或不可能引入外部监控的环境中,这是一个方便的选择。
然而,管理 UI 有一些局限性
- 监控系统与被监控系统交织在一起
- 一定的开销
- 仅存储近期数据(以小时计,而非天或月)
- 基本的用户界面
- 其设计 强调易用性而非最佳可用性。
- 管理 UI 访问通过 RabbitMQ 权限标签系统(或 JWT 令牌范围的约定)进行控制
长期指标存储和可视化服务,如 Prometheus 和 Grafana 或 ELK stack,更适合生产系统。它们提供了
- 监控系统与被监控系统的解耦
- 较低的开销
- 长期指标存储
- 访问其他相关指标,例如 Erlang 运行时 指标
- 更强大和可定制的用户界面
- 指标数据共享方便:指标状态和仪表盘
- 指标访问权限不特定于 RabbitMQ
- 节点特定指标的收集和聚合,对单个节点故障更具弹性
RabbitMQ 从 3.8 版本开始为 Prometheus 和 Grafana 提供了一流的支持。推荐用于生产环境。
入门
管理插件包含在 RabbitMQ 发行版中。与其他任何 插件 一样,在使用之前必须启用它。这通过 rabbitmq-plugins 完成
rabbitmq-plugins enable rabbitmq_management
插件激活后不需要重启节点。
在自动化部署期间,可以通过 已启用插件文件 启用该插件。
用法
管理 UI 访问
可以通过 Web 浏览器访问管理 UI,地址为 http://node-hostname:15672/。
例如,对于运行在主机名为 warp10.local 的机器上的节点,具有 足够权限 的用户可以访问 http://warp10.local:15672/ 或 https://:15672/(前提是 localhost 解析正确)。
请注意,UI 和 HTTP API 端口(通常为 15672)不支持 AMQP 0-9-1、AMQP 1.0、STOMP 或 MQTT 连接。客户端应使用 单独的端口。
用户必须 被授予权限 才能访问管理 UI。
主要功能
管理 UI 实现为一个单页应用程序,它依赖于 HTTP API。一些功能包括
监控队列长度、消息速率(全局和每个队列、交换器或通道)、队列资源使用、节点 GC 活动、客户端连接的数据速率等。
管理用户(需要当前用户的管理权限)。
管理 策略和运行时参数(需要当前用户的足够权限)。
导出模式(vhosts、用户、权限、队列、交换器、绑定、参数、策略)并在 节点启动时导入。这可用于 恢复目的 或自动化新节点和集群的设置。
强制关闭客户端连接,清空队列。
发送和接收消息(在开发环境和故障排除时很有用)。
UI 应用程序支持 Google Chrome、Safari、Firefox 和 Microsoft Edge 浏览器的最新版本。
集群中的管理 UI 访问
任何启用了 rabbitmq_management 插件的集群节点都可以用于管理 UI 访问或监控工具的数据收集。它会连接到其他节点并收集它们的统计信息,然后聚合并返回响应给客户端。
要访问管理 UI,用户必须进行身份验证并拥有特定权限(授权)。这将在 下一节 中介绍。
访问和权限
管理 UI 需要 身份验证和授权,这与 RabbitMQ 对连接客户端的要求类似。除了成功的身份验证,管理 UI 的访问还由用户标签控制。标签使用 rabbitmqctl 进行管理。新创建的用户默认没有任何标签。
有关用户和凭证管理的通用建议,请参阅 部署指南。
| 标签 | 功能 |
|---|---|
| (无) | 无法访问管理插件 |
| management | 用户通过消息协议可以做的任何事情,加上
|
| policymaker | “management”能做的所有事情,加上
|
| monitoring | “management”能做的所有事情,加上
|
| administrator | “policymaker”和“monitoring”能做的所有事情,加上
|
请注意,由于“administrator”拥有“monitoring”的所有功能,“monitoring”拥有“management”的所有功能,因此每个用户通常只需要一个标签。
正常的 RabbitMQ 对资源的权限 仍然适用于监控者和管理员;仅仅因为一个用户是监控者或管理员,并不能让他们通过管理插件或其他方式完全访问交换器、队列和绑定。
所有用户只能列出他们在其中拥有任何权限的虚拟主机中的对象。
仅监控(只读)访问
一些用户是专门为 可观测性目的 创建的。更具体地说,这些用户需要列出所有对象并检查它们的指标,但没有 权限 来添加或删除实体(队列、流、交换器、绑定等)。这些用户也不需要发布或消费消息。
这可以通过以下方式实现
- 创建标记为
monitoring的用户 - 授予其权限(
configure、read、write),这些权限为空(不匹配任何对象)
这两个步骤都可以通过管理 UI 或 HTTP API 完成,或者,如果这些选项不可用或不是最佳选择,则可以使用 CLI 工具
rabbitmqctl add_user可用于创建用户rabbitmqctl set_permissions以授予用户所需的权限,最后,rabbitmqctl set_user_tags以将其标记为monitoring,这将授予他们管理 UI 访问权限
命令行示例:创建仅用于监控的用户
以下示例创建一个用户,该用户对管理 UI/HTTP API 拥有完全访问权限(即,所有虚拟主机和管理功能)
- bash
- PowerShell
- cmd
# See the Access Control guide to learn about user management.
#
# Password is provided as a command line argument.
# Note that certain characters such as !, &, $, #, and so on must be escaped to avoid
# special interpretation by the shell.
rabbitmqctl add_user 'monitoring' '2a55f70a841f18b97c3a7db939b7adc9e34a0f1b'
# tag user 'monitoring' with a tag of the same name
rabbitmqctl set_user_tags 'monitoring' 'monitoring'
# grant the user empty permissions
rabbitmqctl set_permissions --vhost 'vhost-name' 'monitoring' '^$' '^$' '^$'
# See the Access Control guide to learn about user management.
#
# password is provided as a command line argument
rabbitmqctl.bat add_user 'monitoring' '9a55f70a841f18b97c3a7db939b7adc9e34a0f1d'
# passwords with special characters must be quoted correctly
rabbitmqctl.bat add_user 'monitoring' '"w63pnZ&LnYMO(t"'
# grant the user empty permissions
rabbitmqctl.bat set_permissions --vhost 'vhost-name' 'monitoring' '^$' '^$' '^$'
rem See the Access Control guide to learn about user management.
rem password is provided as a command line argument
rabbitmqctl.bat add_user "monitoring" "9a55f70a841f18b97c3a7db939b7adc9e34a0f1d"
rem passwords with special characters must be quoted correctly
rabbitmqctl.bat add_user "monitoring" "w63pnZ&LnYMO(t"
rem grant the user empty permissions
rabbitmqctl set_permissions --vhost "vhost-name" "monitoring" "^$" "^$" "^$"
使用 OAuth 2 进行身份验证
您可以配置 RabbitMQ 以使用 JWT 编码的 OAuth 2.0 访问令牌 来验证客户端应用程序,但是,要在管理 UI 中使用 OAuth 2.0 身份验证,您需要单独配置它。
在管理 UI 中启动 OAuth 2.0 身份验证有两种方式
-
服务提供商发起的登录。这是 OAuth 方法,也是管理 UI 中启动身份验证的默认方式。它使用 PKCE 扩展的 OAuth 2.0 授权码流程 将用户重定向到配置的 OAuth 2.0 提供商进行身份验证。当用户通过身份验证后,他们会获得一个访问令牌,然后返回到管理 UI,在那里他们会自动登录。管理 UI 已针对以下 OAuth 2.0 提供商进行过测试
-
身份提供商发起的登录。对于此类型的登录,用户必须带有访问令牌访问 RabbitMQ。这种类型的身份验证通常出现在提供各种应用程序/服务访问已验证用户的门户中。这些服务之一可能是一个或多个 RabbitMQ 集群。当用户请求访问 RabbitMQ 集群时,门户会将用户重定向到 RabbitMQ 的管理 UI,并附带为用户和 RabbitMQ 集群颁发的访问令牌。此类型的身份验证在 身份提供商发起的登录 子节中介绍。
要在管理 UI 中配置 OAuth 2.0,您需要 最小配置。但是,根据您的用例,您可能需要额外的配置
- 客户端密钥
- 允许管理 HTTP API 进行 Basic 和 OAuth 2 身份验证
- 允许管理 UI 进行 Basic 和 OAuth 2 身份验证
- 从管理 UI 退出
- 为授权和令牌端点配置额外参数
- 特别注意 CSP 标头
connect-src - 身份提供商发起的登录
- 支持多个 OAuth 2.0 资源
最小配置
第一部分是在管理 UI 中使用 OAuth 2.0 身份验证所需的最小配置。接下来的几部分将根据用例解释如何进一步配置 OAuth 2.0。
鉴于 OAuth 2.0 插件 的以下配置
auth_oauth2.resource_server_id = new_resource_server_id
auth_oauth2.issuer = https://my-oauth2-provider.com/realm/rabbitmq
要使用 OAuth 2.0 身份验证,请在管理 UI 中应用以下配置
management.oauth_enabled = true
management.oauth_client_id = rabbit_user_client
management.oauth_scopes = <SPACE-SEPARATED LIST OF SCOPES. See below>
oauth_enabled是一个必填字段oauth_client_id是一个必填字段。它是此 RabbitMQ 集群在 OAuth 提供商中的 OAuth 客户端 ID,用于代表用户请求令牌。oauth_scopes是一个必填字段,除非 OAuth 提供商自动授予与oauth_client_id关联的作用域,否则应始终设置。oauth_scopes是一个空格分隔的字符串列表,指示应用程序请求的权限。大多数 OAuth 提供商仅在用户身份验证期间颁发具有所请求作用域的令牌。RabbitMQ 在用户身份验证期间将此字段与oauth_client_id一起发送。如果未设置此字段,RabbitMQ 将默认为openid profile。
根据以上配置,当用户访问管理 UI 时,会发生以下两个事件
-
RabbitMQ 使用
auth_oauth2.issuer中的 URL 下载 OpenID 提供商配置。在 OAuth 2.0 指南 中了解更多信息警告如果 RabbitMQ 无法下载 OpenID 提供商配置,它将显示一条错误消息,并且管理 UI 中的 OAuth 2.0 身份验证选项将禁用
警告management.oauth_metadata_url和management.oauth_resource_servers.$id.oauth_metadata_url已弃用。您应该按照 此处 的说明配置 OpenId Discovery 端点的路径。这些设置将在 RabbitMQ 4.2.0 中不再存在。在此期间,RabbitMQ 将支持它们,直到您更新配置。提示如果您过去配置了
auth_oauth2.metadata_url,因为您的提供商使用了略有不同的 OpenId Discovery 端点 URL,那么从 RabbitMQ 4.1 开始,您应该改为配置正确的路径和/或包含任何其他参数。请阅读 本节文档,其中解释了如何执行此操作。auth_oauth2.metadata_url在未来版本中可能会被弃用。 -
RabbitMQ 显示一个带有“点击此处登录”标签的按钮。当用户点击按钮时,管理 UI 会启动 OAuth 2.0 授权码流程,将用户重定向到身份提供商进行身份验证并获取令牌。
配置客户端密钥
重要提示:从 OAuth 2.0 的角度来看,管理 UI 是一个公共应用程序,这意味着它无法安全地存储凭证,例如client_secret。这意味着 RabbitMQ 在验证用户时不需要提供 client_secret。
但是,有些 OAuth 提供商可能需要 client_secret 来进行初始用户身份验证请求或令牌刷新请求。例如,UAA 服务器需要 client_secret 来刷新令牌。对于这些情况,可以像下面这样配置 oauth_client_secret
management.oauth_enabled = true
management.oauth_client_id = rabbit_user_client
management.oauth_client_secret = rabbit_user_client
management.oauth_scopes = openid profile rabbitmq.*
允许管理 HTTP API 进行 Basic 和 OAuth 2 身份验证
当使用 management.oauth_enabled = true 时,仍然可以通过 HTTP basic authentication 对 HTTP API 进行身份验证。这意味着以下两个示例都将生效
# swap <token> for an actual token
curl -i -u ignored:<token> https://:15672/api/vhosts
以及
curl -i --header "authorization: Basic <encoded credentials>" https://:15672/api/vhosts
要切换为仅使用 OAuth 2 对管理 HTTP 访问进行身份验证,请将 management.disable_basic_auth 配置键设置为 true
...
management.disable_basic_auth = true
...
当 management.disable_basic_auth 设置为 true 时,只有 Bearer(基于令牌)授权方法有效,例如
# swap <token> for an actual token
curl -i --header "authorization: Bearer <token>" https://:15672/api/vhosts
这适用于除了 GET /definitions 和 POST /definitions 之外的所有端点。这些端点要求令牌通过 token 查询字符串参数传递。
允许管理 UI 进行 Basic 和 OAuth 2 身份验证
当使用 management.oauth_enabled = true 时,仍然可以在管理 UI 中使用 HTTP basic authentication 进行身份验证。
默认情况下,management.oauth_disable_basic_auth 的值为 true,这意味着当 OAuth 2 启用时,管理 UI 只接受 OAuth 2 身份验证。管理 UI 会显示一个带有“点击此处登录”标签的按钮,如下面的截图所示: 
要支持 OAuth 2.0 和 Basic 身份验证,请将 management.oauth_disable_basic_auth 配置键设置为 false
...
management.oauth_disable_basic_auth = false
...
管理 UI 现在会显示一个用于 Basic 身份验证的用户名/密码登录表单,以及用于 OAuth 2 身份验证的“点击此处登录”按钮

从管理 UI 退出
RabbitMQ 实现了 OpenID Connect RP-Initiated Logout 1.0 规范,用于从管理 UI 和 OAuth 提供商中退出用户。其工作原理如下
- 用户点击退出。
- 如果 OpenId Connect Discovery endpoint 返回了
end_session_endpoint,管理 UI 会向该端点发送一个退出请求,以关闭用户在 OAuth 提供商中的会话。当请求完成时,用户也将从管理 UI 中退出。 - 如果没有返回
end_session_endpoint,则用户仅从管理 UI 中退出。
如果 OpenId Connect Discovery endpoint 未返回 end_session_endpoint,您可以在 OAuth 2.0 身份验证后端插件 中进行配置。
RabbitMQ 3.13.1 及更早版本要求 OAuth 2.0 身份验证正常工作时,OpenId Connect Discovery endpoint 返回 end_session_endpoint。
还有另外两种可能触发退出的场景。一种场景是当 OAuth 令牌过期时。尽管 RabbitMQ 会在令牌过期前在后台续订令牌,但如果令牌过期,用户将被注销。第二种场景是当管理 UI 会话超过 登录会话超时 中配置的最大允许时间时。
为授权和令牌端点配置额外参数
有些 OAuth 2.0 提供商需要发送到授权端点和/或令牌端点的请求中包含额外的参数。这些是自定义参数。管理 UI 已经发送了 OAuth 2.0 授权码流程所需的所有参数。
以下是为授权和令牌端点设置名为 audience 的额外参数的示例
management.oauth_authorization_endpoint_params.audience = some-audience-id
management.oauth_token_endpoint_params.audience = some-audience-id
您可以根据需要配置任意数量的参数。
特别注意 CSP 标头 connect-src
为了支持 OAuth 2.0 协议,RabbitMQ 会向 OpenId Connect Discovery endpoint 发送异步 REST 调用。如果您覆盖了默认的 CSP 标头,您必须确保 connect-src CSP 指令将 OpenId Connect Discovery endpoint 列入了白名单。
例如,如果您将 CSP 标头配置为 default-src 'self',那么您默认会设置 connect-src 'self',这意味着您拒绝 RabbitMQ 访问任何外部端点;因此,OAuth 2.0 将被禁用。
除了 connect-src CSP 标头,RabbitMQ 还需要 unsafe-eval 和 unsafe-inline CSP 指令,否则 OAuth 2.0 功能可能无法正常工作。
身份提供商发起的登录
默认情况下,管理 UI 使用 OAuth 2.0 授权码流程来验证和授权用户。但是,在某些情况下,用户更倾向于自动重定向到 RabbitMQ,而无需参与额外的登录流程。通过使用 OAuth 2.0 代理和 Web 门户,可以避免这些额外的登录流程。只需单击一下,用户即可直接进入管理 UI,并在后台获取令牌。这就是所谓的身份提供商发起的登录。
RabbitMQ 公开了一个名为 management.oauth_initiated_logon_type 的设置,其默认值为 sp_initiated。要使用身份提供商发起的登录,请将其设置为 idp_initiated。
management.oauth_enabled = true
management.oauth_initiated_logon_type = idp_initiated
management.oauth_provider_url = https://my-web-portal
使用上述设置后,管理 UI 会公开 /login HTTP 端点,该端点接受 content-type: application/x-www-form-urlencoded,并期望在 access_token 表单字段中提供 JWT 令牌。这是 Web 门户将用户重定向到管理 UI 的端点。此外,当用户访问管理 UI 时,RabbitMQ 还会接受 HTTP Authorization 标头中的 JWT 令牌。
对于 sp_initiated 登录类型,如果设置了 auth_oauth2.issuer,则无需配置 oauth_provider_url。但是,对于 idp_initiated 流程,auth_oauth2.issuer URL 不一定是要发送用户进行身份验证的 URL。在这种情况下,management.oauth_provider_url 会覆盖 auth_oauth2.issuer URL。
支持多个 OAuth 2.0 资源
先决条件
要在管理 UI 中配置多个 OAuth 2.0 资源,您首先需要在 OAuth 2.0 插件中进行配置。假设您有以下 OAuth 2.0 插件配置,它包含四个 OAuth 2.0 资源
auth_oauth2.issuer = http://some_idp_url
auth_oauth2.scope_prefix = rabbitmq.
auth_oauth2.resource_servers.1.id = rabbit_prod
auth_oauth2.resource_servers.2.id = rabbit_dev
auth_oauth2.resource_servers.3.id = rabbit_qa
auth_oauth2.resource_servers.4.id = rabbit_internal
接下来的部分将在管理 UI 中配置这些资源。
OAuth 2.0 资源如何呈现给用户
当管理 UI 中配置了多个 OAuth 2.0 资源时,RabbitMQ 除了“点击此处登录”按钮外,还会显示一个下拉列表。下拉列表包含每个资源的选项。该选项的标签默认是资源的 id,但您可以覆盖它。
可以将某些资源配置为 sp_initiated 登录,而将其他资源配置为 idp_initiated 登录。还可以禁用某个资源,即该资源不会显示在下拉列表中。
可选地为所有资源设置通用设置
如果大多数资源具有共同的配置值,则按如下方式设置它们
management.oauth_enabled = true
management.oauth_initiated_logon_type = sp_initiated
management.oauth_scopes = openid rabbitmq.tag:management rabbitmq.read:*/*
这里我们配置了所有资源或其中大部分需要 sp_initiated 登录类型,并且向授权服务器声明的作用域是 openid rabbitmq.tag:management rabbitmq.read:*/*。
sp_initiated 是 management.oauth_initiated_logon_type 的默认值,因此您无需进行配置。
为每个资源覆盖默认的 oauth_initiated_logon_type
假设资源 rabbit_qa 需要 idp_initiated 登录,但为所有资源配置的登录类型是 sp_initiated。以下配置将覆盖登录类型以及 OAuth 提供商的 URL。
management.oauth_resource_servers.3.id = rabbit_qa
management.oauth_resource_servers.3.label = RabbitMQ QA
management.oauth_resource_servers.3.oauth_initiated_logon_type = idp_initiated
management.oauth_resource_servers.3.oauth_provider_url = http://qa_url
设置 oauth_client_id 设置(如果需要)以及每个资源的标签
接下来,为每个使用 sp_initiated 登录类型的资源配置 oauth_client_id。
这是 sp_initiated 登录类型所需的最小设置。下面的示例显示了资源 rabbit_prod 及其 oauth_client_id 和 label。如果您不指定 label,管理 UI 将使用 id 代替。
management.oauth_resource_servers.1.id = rabbit_prod
management.oauth_resource_servers.1.oauth_client_id = rabbit_prod_mgt_ui
management.oauth_resource_servers.1.label = RabbitMQ Production
通过此配置,当用户选择 RabbitMQ Production 选项时,RabbitMQ 会启动授权码流程,将用户带到 auth_oauth2.issuer 中配置的 URL,并使用以下设置
client_id:rabbit_prod_mgt_uiresource:rabbit_prodscopes:openid rabbitmq.tag:management rabbitmq.read:*/*
为授权和令牌端点配置额外参数
有些 OAuth 2.0 提供商需要发送到授权端点和/或令牌端点的请求中包含额外的参数。这些参数是自定义参数,并且是按资源指定的。管理 UI 已经发送了 OAuth 2.0 授权码流程所需的所有参数。
以下是为资源 some-resource-id 设置 audience 参数到两个端点(授权和令牌)的示例
management.oauth_resource_servers.2.id = some-resource-id
management.oauth_resource_servers.2.oauth_authorization_endpoint_params.audience = some-resource-id
management.oauth_resource_servers.2.oauth_token_endpoint_params.audience = some-resource-id
可选地不在管理 UI 中公开某些资源
您可能不希望在管理 UI 中公开所有配置的资源。例如,在下面的示例中,您没有公开资源 rabbit_internal,该资源保留给应用程序通过其中一个消息协议进行身份验证。
management.oauth_resource_servers.4.id = rabbit_internal
management.oauth_resource_servers.4.disabled = true
管理 UI 截图(无 Basic Authentication)
这是前面配置的管理 UI 布局,其中 Basic Authentication 在管理 UI 中被禁用(management.oauth_disable_basic_auth = true)。

管理 UI 截图(有 Basic Authentication)
这是启用了 Basic Authentication 的管理 UI(management.oauth_disable_basic_auth = false)。

故障排除
OAuth 2 启用集群中的管理 UI 访问故障排除 是一份配套指南,专门介绍常见的 OAuth 2 特定问题。
HTTP API
API 端点
请参阅 HTTP API 参考。
HTTP API 和监控
该 API 旨在用于基本的观测任务。Prometheus 和 Grafana 推荐用于长期指标存储、告警、异常检测等。
任何启用了 rabbitmq-management 插件的集群节点都可以用于管理 UI 访问或 HTTP API 访问。它会连接到其他节点并收集它们的统计信息,然后聚合并返回响应给客户端。
在节点集群中使用 API 时,无需单独联系每个节点。而是联系随机节点或位于集群前面的负载均衡器。
HTTP API 客户端和工具
rabbitmqadmin v2 是一个与 HTTP API 交互的命令行工具。
有关多种语言的 HTTP API 客户端,请参阅 开发者工具。
最大 HTTP 请求体限制
一些 RabbitMQ HTTP API 端点可能接收大型载荷,最显著的是用于 导入定义 的端点。
默认的 HTTP 请求体限制为 20 MiB。如果集群中不使用如此大的定义文件,则可以减小此限制
# lowers the maximum HTTP request body size that will be accepted
# to 1 MiB
management.http.max_body_size = 1000000
当客户端发送的请求体超过限制时,将返回 400 Bad Request 响应。
在 HTTP API 前使用反向代理
在 RabbitMQ 集群前面放置一个反向代理可能是必要的。RabbitMQ 的反向代理设置可能需要小心处理路径中的编码斜杠,如果使用默认虚拟主机(/)。
如果未使用默认虚拟主机,则无需其他设置即可支持编码 URI。换句话说,Nginx 和 Apache 的配置将只需要任何基于 HTTP 的服务的标准最小设置。
Nginx
如果 RabbitMQ HTTP API 访问配置为根位置(/),则该位置不得以斜杠结尾
# trailing slash in the location must be omitted only if default RabbitMQ virtual host is used
location / {
proxy_pass http://rabbitmq-host:15672;
}
如果将其他位置用于代理到 HTTP API 的请求,则必须使用 URI 重写 规则
# these rewrites are only if default RabbitMQ virtual host is used
location ~* /rabbitmq/api/(.*?)/(.*) {
proxy_pass http://rabbitmq-host:15672/api/$1/%2F/$2?$query_string;
}
location ~* /rabbitmq/(.*) {
rewrite ^/rabbitmq/(.*)$ /$1 break;
proxy_pass http://rabbitmq-host:15672;
}
Apache
为了支持 URI 中的编码斜杠,Apache 要求用户显式启用 AllowEncodedSlashes。
# required only if default RabbitMQ virtual host is used
AllowEncodedSlashes On
针对 Apache 虚拟主机。Apache 需要同时启用 mod_proxy 和 mod_proxy_http。该位置还需要 nocanon 设置
ProxyPassReverse / http://rabbitmq-host:15672/
# "nocanon" is required only if default RabbitMQ virtual host is used
ProxyPass / http://rabbitmq-host:15672/ nocanon
配置
有几个配置选项会影响管理插件。这些选项通过主要的 RabbitMQ 配置文件 进行管理。
可以配置 HTTP API 和管理 UI 使用不同的端口或网络接口,启用 HTTPS 等。
虽然很少需要,但可以配置多个监听器(端口),例如同时启用 HTTPS 并保留对只能使用 HTTP(无 TLS)的客户端的支持。
端口
端口使用 management.tcp.port 键进行配置
management.tcp.port = 15672
可以使用 management.tcp.ip 键配置 API 端点将使用的接口,类似于 消息协议监听器
management.tcp.ip = 0.0.0.0
要检查正在运行的节点使用的接口和端口,请使用 rabbitmq-diagnostics
rabbitmq-diagnostics -s listeners
# => Interface: [::], port: 15672, protocol: http, purpose: HTTP API
# => Interface: [::], port: 15671, protocol: https, purpose: HTTP API over TLS (HTTPS)
或 lsof、ss 或 netstat 等工具。
HTTPS
管理插件可以配置为使用 HTTPS。有关证书颁发机构、证书和私钥文件的更多信息,请参阅 TLS 指南。
management.ssl.port = 15671
management.ssl.cacertfile = /path/to/ca_certificate.pem
management.ssl.certfile = /path/to/server_certificate.pem
management.ssl.keyfile = /path/to/server_key.pem
## This key must only be used if private key is password protected
# management.ssl.password = bunnies
有关 HTTPS 监听器的更多 TLS 选项 可以进行配置。
management.ssl.port = 15671
management.ssl.cacertfile = /path/to/ca_certificate.pem
management.ssl.certfile = /path/to/server_certificate.pem
management.ssl.keyfile = /path/to/server_key.pem
## This key must only be used if private key is password protected
# management.ssl.password = bunnies
management.ssl.honor_cipher_order = true
management.ssl.honor_ecc_order = true
management.ssl.client_renegotiation = false
management.ssl.secure_renegotiate = true
management.ssl.versions.1 = tlsv1.2
management.ssl.versions.2 = tlsv1.1
management.ssl.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
management.ssl.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
management.ssl.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
management.ssl.ciphers.4 = ECDHE-RSA-AES256-SHA384
management.ssl.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384
management.ssl.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384
management.ssl.ciphers.7 = ECDH-ECDSA-AES256-SHA384
management.ssl.ciphers.8 = ECDH-RSA-AES256-SHA384
management.ssl.ciphers.9 = DHE-RSA-AES256-GCM-SHA384
## Usually RabbitMQ nodes do not perform peer verification of HTTP API clients
## but it can be enabled if needed. Clients then will have to be configured with
## a certificate and private key pair.
##
## See ./ssl#peer-verification for details.
# management.ssl.verify = verify_peer
# management.ssl.fail_if_no_peer_cert = true
下面是 经典配置格式 中的相同示例。
经典配置格式示例主要是为了完整性而提供,强烈建议使用现代的 rabbitmq.conf 格式来配置此插件。
%% The classic config format example is provided primarily for completeness sake,
%% using the modern `rabbitmq.conf` format for configuring this plugin is highly recommended.
[
{rabbitmq_management,
[
{ssl_config, [{port, 15671},
{ssl, true},
{cacertfile, "/path/to/ca_certificate.pem"},
{certfile, "/path/to/server_certificate.pem"},
{keyfile, "/path/to/server_key.pem"},
%% don't do peer verification to HTTPS clients
{verify, verify_none},
{fail_if_no_peer_cert, false},
{client_renegotiation, false},
{secure_renegotiate, true},
{honor_ecc_order, true},
{honor_cipher_order, true},
{versions,['tlsv1.2']},
{ciphers, ["ECDHE-ECDSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-ECDSA-AES256-SHA384",
"ECDHE-RSA-AES256-SHA384",
"ECDH-ECDSA-AES256-GCM-SHA384",
"ECDH-RSA-AES256-GCM-SHA384",
"ECDH-ECDSA-AES256-SHA384",
"ECDH-RSA-AES256-SHA384",
"DHE-RSA-AES256-GCM-SHA384"
]}
]}
]}
].
同时使用 HTTP 和 HTTPS
可以在不同端口上同时使用 HTTP 和 HTTPS
management.tcp.port = 15672
management.ssl.port = 15671
management.ssl.cacertfile = /path/to/ca_certificate.pem
management.ssl.certfile = /path/to/server_certificate.pem
management.ssl.keyfile = /path/to/server_key.pem
相同的配置键可用于配置单个监听器(仅 HTTP 或 HTTPS),并与 Web STOMP 和 Web MQTT 使用的配置相匹配。
高级 HTTP 选项
Cowboy 是管理插件使用的嵌入式 Web 服务器,它提供了许多可用于自定义服务器行为的选项。大多数选项是在 RabbitMQ 3.7.9 中引入的。
响应压缩
响应压缩默认启用。要显式启用它,请使用 management.tcp.compress
management.tcp.compress = true
客户端不活动超时
某些 HTTP API 端点响应速度很快,而其他端点可能需要向客户端返回或流式传输大量数据(例如,数千个连接),或执行与输入成比例的操作(例如 导入大型定义文件)。在这些情况下,处理请求所需的时间可能会超过 Web 服务器和 HTTP 客户端的某些超时。
可以使用 management.tcp.idle_timeout、management.tcp.inactivity_timeout、management.tcp.request_timeout 选项来调整 Cowboy 超时。
management.tcp.inactivity_timeout控制 HTTP(S) 客户端的 TCP 连接不活动超时。达到此值时,连接将由 HTTP 服务器关闭。management.tcp.request_timeout控制客户端发送 HTTP 请求的窗口时间。management.tcp.idle_timeout控制在 HTTP 请求上下文中,客户端发送更多数据的窗口时间(如果有)。
如果 HTTP 客户端和管理 HTTP 服务器之间使用了负载均衡器或代理,那么 inactivity_timeout 和 idle_timeout 的值应至少等于(通常大于)负载均衡器使用的超时和不活动值。
以下是一些修改超时的示例配置片段
# Configures HTTP (non-encrypted) listener timeouts
management.tcp.idle_timeout = 120000
management.tcp.inactivity_timeout = 120000
management.tcp.request_timeout = 10000
# Configures HTTPS (TLS-enabled) listener timeouts
management.ssl.idle_timeout = 120000
management.ssl.inactivity_timeout = 120000
management.ssl.request_timeout = 10000
所有值均为毫秒。它们的默认值有所不同
management.tcp.inactivity_timeout的默认值为 300 秒management.tcp.request_timeout的默认值为 60 秒management.tcp.idle_timeout的默认值为 5 秒
建议如果需要更改不活动或空闲超时,management.tcp.inactivity_timeout 的值应等于或大于 management.tcp.idle_timeout 的值。
management.tcp.request_timeout 通常不需要增加,因为客户端在建立 TCP 连接后不久就会发送请求。
HTTP 请求日志记录
默认情况下,RabbitMQ 节点不会 记录 任何 HTTP API 请求。
要启用 HTTP API 访问日志记录,请使用 management.http_log_dir 键配置一个目录路径,节点可以在其中创建访问日志文件
management.http_log_dir = /path/to/a/writeable/directory
为了使更改生效,请重启插件或节点。
统计间隔
默认情况下,服务器每 5 秒(5000 毫秒)会发出统计事件。管理插件中显示的消息速率值是根据此周期计算的。
在具有大量统计信息实体(如 连接、通道、队列)的环境中,增加此值可以减少统计信息收集的 CPU 资源消耗。
为此,请将 collect_statistics_interval 配置键的值设置为所需的毫秒间隔,然后重启节点
# 15s
collect_statistics_interval = 15000
消息速率
管理插件默认显示全局以及每个队列、通道、交换器和虚拟主机之间的消息速率。这些被称为基本消息速率。
它还可以显示通道到交换器、交换器到队列和队列到通道的所有组合的消息速率。这些被称为详细消息速率。详细消息速率默认禁用,因为当通道、队列和交换器的组合数量很大时,它们可能会占用大量内存。
或者,可以完全禁用消息速率。这有助于减少插件的 CPU 资源消耗。
消息速率模式由 management.rates_mode 配置键控制
# supported values: basic, detailed, none
management.rates_mode = basic
支持的值为 basic(默认)、detailed 和 none。
样本(数据点)保留
管理插件将保留某些数据(如消息速率和队列长度)的样本。根据数据保留的时间长短,UI 图表上的某些时间范围选项可能不完整或不可用。
有三种策略
global:保留概述和虚拟主机页面数据的时长basic:保留单个连接、通道、交换器和队列数据的时长detailed:保留连接、通道、交换器和队列之间消息速率(如下面的“消息速率细分”所示)数据的时长
以下是配置示例
management.sample_retention_policies.global.minute = 5
management.sample_retention_policies.global.hour = 60
management.sample_retention_policies.global.day = 1200
management.sample_retention_policies.basic.minute = 5
management.sample_retention_policies.basic.hour = 60
management.sample_retention_policies.detailed.10 = 5
上面的示例配置以 5 秒分辨率(每 5 秒采样一次)保留全局数据一分钟,然后以 1 分钟(60 秒)分辨率保留一小时,然后以 20 分钟分辨率保留一天。它以 5 秒分辨率保留基本数据一分钟,以 1 分钟(60 秒)分辨率保留一小时,并且仅保留详细数据 10 秒。
所有三个策略都是强制性的,并且必须至少包含一个保留设置(周期)。
禁用统计信息和指标收集
可以禁用 UI 和 HTTP API 中的统计信息,以便它们仅用于操作。如果使用外部监控解决方案(如 Prometheus 和 Grafana),这是一个有用的功能。如果以任何方式禁用统计信息,UI 中将隐藏所有图表和详细统计信息。
为了完全禁用内部指标收集,必须在 rabbitmq_management_agent 插件中设置 disable_metrics_collector 标志。即使禁用了收集,Prometheus 插件 仍然可以工作。
management_agent.disable_metrics_collector = true
如果使用外部监控系统,禁用指标收集是首选选项,因为它减少了统计信息收集和聚合在代理上产生的开销。如果统计信息仅临时禁用,或者在某些 HTTP API 查询中不需要,则可以在 rabbitmq_management 插件中禁用聚合。禁用标志也可以作为 URI 中的查询字符串参数传递。
截至目前,Prometheus 插件 无法报告单个队列的总数,因此有一个配置选项允许在 queues 端点中列出 messages、messages_ready 和 messages_unacknowledged。
以下配置示例禁用了统计信息,但返回了 queues 页面中的单个队列总数
management.disable_stats = true
management.enable_queue_totals = true
内容安全策略 (CSP)
可以配置 HTTP API 响应使用的 CSP 标头 值。默认值为 script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
management.csp.policy = script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
该值可以是任何有效的 CSP 标头字符串
management.csp.policy = default-src https://rabbitmq.eng.example.local
也允许使用通配符
management.csp.policy = default-src 'self' *.eng.example.local
CSP 策略 frame-ancestors 指令 可用于防止嵌入管理 UI 的框架,从而减轻某些类型的跨帧脚本攻击
# prohibits iframe embedding of the UI
management.csp.policy = frame-ancestors 'none'
严格传输安全 (HSTS)
可以配置 HTTP API 响应使用的 Strict Transport Security 标头 值
management.hsts.policy = max-age=31536000; includeSubDomains
跨域资源共享 (CORS)
管理 UI 应用程序默认会使用 跨域资源共享 机制(也称为 CORS)拒绝访问托管在其自身域之外的网站。可以列出允许的来源(白名单)
management.cors.allow_origins.1 = https://origin1.org
management.cors.allow_origins.2 = https://origin2.org
可以使用通配符允许任何来源使用 API。对于可能暴露给公众的 UI 应用程序的部署,强烈不建议这样做。
management.cors.allow_origins.1 = *
CORS 预检请求由浏览器缓存。管理插件默认定义 30 分钟的超时时间。该值可以更改。单位为秒
management.cors.allow_origins.1 = https://origin1.org
management.cors.allow_origins.2 = https://origin2.org
management.cors.max_age = 3600
其他安全相关标头
可以为管理 UI 和 HTTP API 响应设置一些其他的安全相关标头。请注意,其中一些已被 CORS 和浏览器安全领域中其他较新的开发所取代。
支持的标头为
management.headers.content_type_options = nosniff
management.headers.xss_protection = 1; mode=block
management.headers.frame_options = DENY
它们可以与前面提到的 CORS、HSTS、CSP 标头结合使用
management.hsts.policy = max-age=31536000; includeSubDomains
management.csp.policy = default-src 'self'; script-src 'self' 'unsafe-eval'
management.headers.content_type_options = nosniff
management.headers.xss_protection = 1; mode=block
management.headers.frame_options = DENY
登录会话超时
用户登录后,其 Web UI 登录会话默认会在 8 小时后过期。可以使用 login_session_timeout 设置配置不同的超时时间。
值应为整数:它控制登录会话的长度(以分钟为单位)。时间到后,用户将被注销。
以下示例将会话超时设置为 1 小时
management.login_session_timeout = 60
路径前缀
某些环境要求为管理插件的所有 HTTP 请求使用自定义前缀。management.path_prefix 设置允许为管理插件中的所有 HTTP 请求处理程序设置任意前缀。
将 management.path_prefix 设置为 /my-prefix 指定所有 API 请求使用 URI host:port/my-prefix/api/[...]
管理 UI 登录页面的 URI 将是 host:port/my-prefix/ - 请注意,在这种情况下,尾部斜杠是必需的。
management.path_prefix = /my-prefix
示例
RabbitMQ 的示例配置文件,该文件启用请求日志记录,将统计间隔增加到 10 秒,并显式将其他一些相关参数设置为其默认值,如下所示
listeners.tcp.default = 5672
collect_statistics_interval = 10000
## Note: this uses the core `load_definitions` key over
## now deprecated `management.load_definitions`
# load_definitions = /path/to/exported/definitions.json
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
management.ssl.port = 15671
management.ssl.ip = 0.0.0.0
management.ssl.cacertfile = /path/to/ca_certificate.pem
management.ssl.certfile = /path/to/server_certificate.pem
management.ssl.keyfile = /path/to/server_key.pem
management.http_log_dir = /path/to/rabbit/logs/http
management.rates_mode = basic
# Configure how long aggregated data (such as message rates and queue
# lengths) is retained.
# Your can use 'minute', 'hour' and 'day' keys or integer key (in seconds)
management.sample_retention_policies.global.minute = 5
management.sample_retention_policies.global.hour = 60
management.sample_retention_policies.global.day = 1200
management.sample_retention_policies.basic.minute = 5
management.sample_retention_policies.basic.hour = 60
management.sample_retention_policies.detailed.10 = 5
启动时加载定义(模式)
节点和集群存储的信息可以被认为是模式、元数据或拓扑。用户、虚拟主机、队列、交换器、绑定、运行时参数都属于此类。
可以通过 rabbitmqctl、rabbitmqadmin 或此插件提供的 HTTP API 导出和导入定义。
请参考 定义指南。
集群中的指标收集和 HTTP API
客户端请求
管理插件能够感知集群。它可以启用在一个或多个节点上,并查看整个集群的信息,无论您连接到哪个节点。
在部分节点上运行管理插件
可以将管理插件部署在集群节点的一部分上。在这种情况下,只有运行该插件的节点才能处理客户端 HTTP API 请求。为了收集每个集群节点的指标,仍然要求在每个节点上启用 rabbitmq-management-agent 插件,否则该节点的指标将不可用。
集群中的聚合查询
在集群中,HTTP API 在处理客户端请求时执行集群范围的查询,这意味着它可能会受到网络分区、网络延迟和无响应节点的影响。
节点间聚合查询的超时由 net tick 机制 控制。降低值可能有助于减少无响应节点引入的延迟。小于 10 秒的值可能产生误报,必须避免。
与 HTTP API 不同,Prometheus 监控端点仅提供节点本地数据,并且通常不受集群中其他节点故障或不可用的影响。
(反向 HTTP) 代理设置
可以通过符合 RFC 1738 的任何代理使 Web UI 可用。以下示例 Apache 配置说明了使 Apache 符合要求的最低必需指令。它假定管理 Web UI 使用默认端口 15672
AllowEncodedSlashes NoDecode
ProxyPass "/api" https://:15672/api nocanon
ProxyPass "/" https://:15672/
ProxyPassReverse "/" https://:15672/
重新启动统计数据库
统计数据库完全存储在内存中。其所有内容都是暂时的,应视为如此。
在现代版本中,每个节点都有自己的统计数据库,其中包含该节点上记录的部分统计信息。
可以使用 rabbitmqctl 或 HTTP API 端点在给定节点上重启统计数据库
DELETE /api/reset/:node
rabbitmqctl eval 'rabbit_mgmt_storage:reset().'
要重置所有节点上的整个统计数据库,请使用
DELETE /api/reset
rabbitmqctl eval 'rabbit_mgmt_storage:reset_all().'
内存使用分析和内存管理
管理 UI 可用于检查节点的内存使用情况,包括按类别细分显示。有关详细信息,请参阅 内存使用分析 指南。
管理数据库围绕周期性发出的统计信息构建,这些统计信息受上面描述的统计信息间隔的调节,或者在创建/声明某些组件(例如,打开新的连接或通道,或声明队列)或关闭/删除时构建。消息速率不直接影响管理数据库的内存使用。
统计数据库消耗的总内存量取决于拓扑大小(例如队列数量)、并发连接和通道数量、事件发出间隔、有效速率模式和保留策略。
发出统计信息的实体(连接、通道、队列、节点)会定期发出。间隔可以使用 collect_statistics_interval 键进行配置
# sets the interval to 30 seconds
collect_statistics_interval = 30000
将间隔值增加到 30-60 秒将减少大量连接、通道和队列系统的 CPU 占用和峰值内存消耗。这有一个缺点:这些实体的指标将每 30-60 秒刷新一次。对于 外部监控 的生产系统来说,这可能是合理的,但对于操作员来说,会使管理 UI 变得不那么方便。
可以通过设置 stats_event_max_backlog 参数的最大积压队列大小来限制通道和统计信息收集器进程的内存使用。如果积压队列已满,新的通道和队列统计信息将被丢弃,直到先前的信息被处理。
统计间隔也可以在运行时更改。这样做不会影响现有的连接、通道或队列。只有新的统计信息发出实体会受到影响。
rabbitmqctl eval 'application:set_env(rabbit, collect_statistics_interval, 60000).'
统计数据库可以重启(见上文),从而强制释放所有内存。管理 UI 的概述页面包含用于重置单个节点以及集群中所有节点的统计数据库的按钮。
通过 HTTP API 发布和消费
可以通过 HTTP API 发布和消费消息。不推荐这种消息方式:建议使用 RabbitMQ 支持的二进制消息协议之一。通过这种方式发布和消费将显著提高效率,并提供对诸如 确认 等各种消息协议功能的访问。
在 长连接消息协议 不是选项的环境中,通过 HTTP API 发布可能很有用。