管理插件
概述
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 堆栈)更适合生产系统。它们提供
- 监控系统与被监控系统解耦
- 较低的开销
- 长期指标存储
- 访问其他相关指标,例如Erlang 运行时指标
- 更强大且可自定义的用户界面
- 指标数据共享的便利性:指标状态和仪表板
- 指标访问权限不是特定于 RabbitMQ 的
- 节点特定指标的收集和聚合,这对于单个节点故障更具弹性
从 3.8 版本开始,RabbitMQ 为Prometheus 和 Grafana提供了首要支持。建议在生产环境中使用。
入门指南
管理插件包含在 RabbitMQ 发行版中。与任何其他插件一样,必须先启用它才能使用。这可以通过rabbitmq-plugins完成
rabbitmq-plugins enable rabbitmq_management
插件激活后不需要重新启动节点。
在自动化部署期间,可以通过启用的插件文件启用该插件。
用法
管理 UI 访问
可以使用 Web 浏览器通过 http://node-hostname:15672/
访问管理 UI。
例如,对于在主机名为 warp10.local
的机器上运行的节点,具有足够权限的用户可以通过 http://warp10.local:15672/
或 https://127.0.0.1:15672/
访问它(前提是 localhost
解析正确)。
请注意,UI 和 HTTP API 端口(通常为 15672)不支持 AMQP 0-9-1、AMQP 1.0、STOMP 或 MQTT 连接。单独的端口应由这些客户端使用。
用户必须获得管理 UI 访问权限。
主要功能
管理 UI 作为单个页面应用程序实现,它依赖于HTTP API。一些功能包括
监控队列长度、消息速率(全局和每个队列、交换机或通道)、队列的资源使用情况、节点 GC 活动、客户端连接的数据速率等等。
管理用户(提供当前用户的管理权限)。
管理策略和运行时参数(提供当前用户的足够权限)。
导出模式(虚拟主机、用户、权限、队列、交换机、绑定、参数、策略)并在节点启动时导入。这可用于恢复目的或新节点和集群的设置自动化。
强制关闭客户端连接,清除队列。
发送和接收消息(在开发环境和故障排除中很有用)。
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 使用基本身份验证和 OAuth 2 身份验证
- 允许管理 UI 使用基本身份验证和 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
是必填字段。它是 OAuth 提供商中与此 RabbitMQ 集群关联的 OAuth 客户端 ID,用于代表用户请求令牌。oauth_scopes
是必填字段,必须始终设置,除非 OAuth 提供商自动授予与oauth_client_id
关联的范围。oauth_scopes
是一个空格分隔的字符串列表,指示应用程序请求哪些权限。大多数 OAuth 提供商仅在用户身份验证期间发出具有所请求范围的令牌。RabbitMQ 在用户身份验证期间将此字段与其oauth_client_id
一起发送。如果未设置此字段,RabbitMQ 默认为openid profile
。
根据以上配置,当用户访问管理 UI 时,会发生以下两个事件
-
RabbitMQ 使用
auth_oauth2.issuer
中找到的 URL 后跟路径/.well-known/openid-configuration
下载 OpenID 提供商配置。它包含有关其他端点的信息,例如jwks_uri
(用于下载用于验证令牌签名的密钥)或token_endpoint
。警告如果 RabbitMQ 无法下载 OpenID 提供商配置,则会显示错误消息,并且管理 UI 中的 OAuth 2.0 身份验证将被禁用。
-
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 使用基本身份验证和 OAuth 2 身份验证
当使用management.oauth_enabled = true
时,仍然可以使用HTTP 基本身份验证对 HTTP API 进行身份验证。这意味着以下两个示例都将起作用
# swap <token> for an actual token
curl -i -u ignored:<token> https://127.0.0.1:15672/api/vhosts
以及
curl -i --header "authorization: Basic <encoded credentials>" https://127.0.0.1:15672/api/vhosts
要切换到仅对管理 HTTP 访问使用 OAuth 2 进行身份验证,请将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://127.0.0.1:15672/api/vhosts
这适用于所有端点,除了GET /definitions
和POST /definitions
。这些端点需要在token
查询字符串参数中传递令牌。
允许管理 UI 使用基本身份验证和 OAuth 2 身份验证
当使用management.oauth_enabled = true
时,仍然可以在管理 UI 中使用HTTP 基本身份验证进行身份验证。
默认情况下,management.oauth_disable_basic_auth
的值为true
,这意味着当启用 OAuth 2 时,管理 UI 仅接受 OAuth 2 身份验证。管理 UI 会显示一个带有“点击此处登录”标签的按钮,如下面的屏幕截图所示:
要支持 OAuth 2.0 和基本身份验证,请将management.oauth_disable_basic_auth
配置密钥设置为false
...
management.oauth_disable_basic_auth = false
...
管理 UI 现在除了用于 OAuth 2 身份验证的“点击此处登录”按钮外,还显示了一个用于基本身份验证的用户名/密码登录表单
退出管理 UI
RabbitMQ 实现OpenID Connect RP 发起注销 1.0规范以注销管理 UI 和 OAuth 提供商中的用户。其工作原理如下
- 用户点击注销。
- 如果OpenId Connect 发现端点返回
end_session_endpoint
,则管理 UI 会向该端点发送注销请求以关闭 OAuth 提供商中的用户会话。请求完成后,用户也会从管理 UI 中注销。 - 如果没有返回
end_session_endpoint
,则用户仅从管理 UI 中注销。
如果OpenId Connect 发现端点未返回end_session_endpoint
,则可以在OAuth 2.0 身份验证后端插件中对其进行配置。
RabbitMQ 3.13.1 及更早版本需要返回OpenId Connect 发现端点end_session_endpoint
才能使 OAuth 2.0 身份验证正常工作。
还有另外两种情况可能触发注销。一种情况是 OAuth 令牌过期。尽管 RabbitMQ 在令牌过期前会在后台续订令牌,但如果令牌过期,用户将被注销。第二种情况是管理 UI 会话超过登录会话超时中配置的最大允许时间。
特别注意 CSP 标头connect-src
为了支持 OAuth 2.0 协议,RabbitMQ 会异步向 OpenId Connect Discovery 端点 发起 REST 调用。如果您覆盖了默认的 CSP 头部,则必须确保 connect-src
CSP 指令将 OpenId Connect Discovery 端点 列入白名单。
例如,如果您将 CSP 头部配置为 default-src 'self'
,则默认情况下会设置 connect-src 'self'
,这意味着您拒绝 RabbitMQ 访问任何外部端点;从而禁用 OAuth 2.0。
除了 connect-src
CSP 头部之外,RabbitMQ 还需要 CSP 指令 unsafe-eval
和 unsafe-inline
,否则 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 公开了 HTTP 端点 /login
,该端点接受 content-type: application/x-www-form-urlencoded
,并期望 JWT 令牌位于 access_token
表单字段中。这是 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_ui
resource
:rabbit_prod
scopes
:openid rabbitmq.tag:management rabbitmq.read:*/*
可选地不在管理 UI 中显示某些资源
您可能不想在 OAuth 2.0 插件中显示所有配置的资源。例如,在以下示例中,您没有显示资源 rabbit_internal
,该资源保留供应用程序通过其中一个消息传递协议进行身份验证。
management.oauth_resource_servers.4.id = rabbit_internal
management.oauth_resource_servers.4.disabled = true
未启用基本身份验证的管理 UI 屏幕截图
这是在管理 UI 中禁用基本身份验证(management.oauth_disable_basic_auth = true
)时,之前的配置的管理 UI 布局。
启用基本身份验证的管理 UI 屏幕截图
这是在管理 UI 中启用基本身份验证(management.oauth_disable_basic_auth = false
)时的管理 UI。
故障排除
在启用 OAuth 2 的集群中排除管理 UI 访问故障 是一份配套指南,专门针对常见的 OAuth 2 特定问题。
HTTP API
API 端点
激活后,管理插件默认情况下会在 http://server-name:15672/api/
提供 HTTP API。浏览到该位置以获取有关 API 的更多信息。为了方便起见,相同的 API 参考 可在 GitHub 上获取。
HTTP API 和监控
该 API 旨在用于基本的可观察性任务。Prometheus 和 Grafana 建议用于长期指标存储、警报、异常检测等。
任何已激活 rabbitmq-management
插件的集群节点都可以用于管理 UI 访问或 HTTP API 访问。它将联系其他节点并收集它们的统计信息,然后聚合并向客户端返回响应。
在节点集群中使用 API 时,无需单独通过 HTTP API 联系每个节点。而是联系一个随机节点或位于集群前面的负载均衡器。
HTTP API 客户端和工具
rabbitmqadmin 是一种与 HTTP API 交互的 Python 命令行工具。可以从任何已启用管理插件的 RabbitMQ 节点下载,位于 http://node-hostname:15672/cli/
。
有关多种语言的 HTTP API 客户端,请参阅 开发人员工具。
某些 API 端点会返回大量信息。可以通过筛选 HTTP GET
请求返回的列来减少数据量。有关详细信息,请参阅 最新的 HTTP API 文档。
在 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
可以配置 API 端点将使用哪个接口,类似于 消息协议监听器,使用 `management.tcp.ip` 键
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 请求日志记录
要创建对 HTTP API 请求的简单访问日志,请将 `management.http_log_dir` 键的值设置为可以创建日志的目录的路径
management.http_log_dir = /path/to/folder
要使更改生效,请重新启动插件或节点。
统计信息间隔
默认情况下,服务器将每 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 分钟,然后以 1 分钟(60 秒)的分辨率保留 1 小时,然后以 20 分钟的分辨率保留 1 天。它以 5 秒的分辨率保留基本数据 1 分钟,以 1 分钟(60 秒)的分辨率保留 1 小时,并且仅保留详细数据 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 响应使用什么 严格传输安全标头 值
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
或 HTTP API(包括 rabbitmqadmin
)导出和导入。
请参阅 定义指南。
集群中的指标收集和 HTTP API
客户端请求
管理插件了解集群。它可以在集群中的一个或多个节点上启用,并查看与整个集群相关的信息,无论您连接到哪个节点。
在节点子集上运行管理插件
可以仅在集群节点的子集上部署管理插件。在这种情况下,只有运行插件的节点才能服务客户端 HTTP API 请求。为了使每个集群节点都收集其指标,仍然需要在每个节点上启用 rabbitmq-management-agent
插件,否则该节点的指标将不可用。
集群中的聚合查询
在集群中,HTTP API 在处理客户端请求时执行集群范围的查询,这意味着它可能会受到网络分区、网络速度下降和节点无响应的影响。
节点间聚合查询的超时时间通过 网络滴答机制 控制。降低该值可能有助于减少最近变得无响应的节点引入的延迟。低于 10 秒的值可能会产生误报,必须避免。
与 HTTP API 相比,Prometheus 监控端点 仅提供节点本地数据,通常不受集群中其他节点故障或不可用性的影响。
(反向 HTTP)代理设置
可以通过符合 RFC 1738 的任何代理访问 Web UI。以下 Apache 配置示例说明了使 Apache 符合标准所需的最低限度指令。它假定管理 Web UI 在默认端口 15672 上。
AllowEncodedSlashes NoDecode
ProxyPass "/api" https://127.0.0.1:15672/api nocanon
ProxyPass "/" https://127.0.0.1:15672/
ProxyPassReverse "/" https://127.0.0.1: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 发布可能很有用。