配置
概述
RabbitMQ 附带默认的内置设置。在某些环境(例如开发和 QA)中,这些设置可能完全足够。对于所有其他情况,以及 生产部署调整,都有方法可以配置代理中的许多内容以及 插件。
本指南涵盖了与配置相关的多个主题
- 配置方式:服务器和插件的各种设置是如何配置的
- 配置文件:主 rabbitmq.conf 或 .conf 文件目录,以及可选的 advanced.config
- 不同平台上的默认 配置文件位置
- 配置故障排除:如何 查找配置文件位置 和 检查和验证有效配置
rabbitmq.conf中的 环境变量插值- RabbitMQ 节点使用的 环境变量
- 操作系统(内核)限制
- 可用的 核心服务器设置
- 可用的 环境变量
- 如何 加密
rabbitmq.conf和advanced.config中敏感的配置值
等等。
由于配置会影响系统的许多方面,包括插件,因此各个 文档指南 会更深入地探讨可配置的内容。运行时调整 是本指南的补充,侧重于运行时可配置的参数。部署指南 是一个相关指南,概述了大多数生产环境中可能需要调整的设置。
配置方式
RabbitMQ 节点可以通过多种机制进行配置,这些机制负责不同的区域
| 机制 | 描述 |
包含 TCP 监听器和其他 网络相关设置、TLS、资源限制(警报)、身份验证和授权后端、消息存储设置 等的服务器和插件设置。 | |
用于定义 节点名称、文件和目录位置、从 shell 获取的运行时标志,或在环境配置文件 | |
当使用 内部身份验证/授权后端 时, | |
| |
| |
| |
定义可实时更改的群集范围设置,以及方便为队列组(交换器等)配置的设置,例如包含可选队列参数。 | |
控制系统的低级方面:内存分配设置、节点间通信缓冲区大小、运行时调度程序设置等。 | |
控制内核强制执行的进程限制:最大打开文件句柄限制、最大进程数和内核线程数、最大驻留集大小等。 |
大多数设置都使用前两种方法进行配置。因此,本指南重点介绍它们。
配置文件
简介
虽然 RabbitMQ 的某些设置可以通过环境变量进行调整,但大多数设置是通过名为 rabbitmq.conf 的 主配置文件 进行配置的。
这包括核心服务器和插件的配置。可以另外使用一个配置文件来配置主文件配置格式无法表达的设置。这将在下文中更详细地介绍。
以下各节将介绍这两种文件的语法和 位置、查找示例的地点等等。
配置文件位置
本指南的其余部分将更详细地介绍此主题。
如有疑问,请参阅日志文件和/或管理 UI,具体方法如下一节所述。
如何查找配置文件位置
可以通过检查 RabbitMQ 日志文件来验证活动配置文件。它会显示在 日志文件 的顶部,以及其他代理启动日志条目。例如
node : rabbit@example
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/advanced.config
: /etc/rabbitmq/rabbitmq.conf
如果 RabbitMQ 找不到或无法读取配置文件,日志条目会告知
node : rabbit@example
home dir : /var/lib/rabbitmq
config file(s) : /var/lib/rabbitmq/hare.conf (not found)
或者,要查找本地节点使用的配置文件位置,请使用 rabbitmq-diagnostics status 命令
# displays key
rabbitmq-diagnostics status
并查找 Config files 部分,该部分应如下所示
Config files
* /etc/rabbitmq/advanced.config
* /etc/rabbitmq/rabbitmq.conf
要检查特定节点(包括远程节点)的位置,请使用 -n(--node 的缩写)开关
rabbitmq-diagnostics status -n [node name]
最后,可以在 管理 UI 中找到配置文件位置,以及有关节点的其他详细信息。
在对配置设置进行故障排除时,在 验证有效节点配置 之前,检查配置文件路径是否正确、是否存在且是否可以加载(例如,文件是否可读)非常有帮助。结合这些步骤,可以快速缩小最常见的配置错误问题范围。
现代和旧的配置文件格式
所有 支持的 RabbitMQ 版本 都使用 类似 ini 的 sysctl 配置文件格式 作为主配置文件。该文件通常命名为 rabbitmq.conf。
新配置格式更简单,更易于人类阅读和机器生成。与 RabbitMQ 3.7.0 之前使用的经典配置格式相比,它也相对有限。例如,在配置 LDAP 支持 时,可能需要使用深度嵌套的数据结构来表示所需的配置。
为了满足此需求,现代 RabbitMQ 版本允许在单独的文件中同时使用这两种格式:rabbitmq.conf 使用新样式格式,推荐用于大多数设置,而 advanced.config 涵盖了 ini 样式配置无法表达的更高级设置。这将在以下各节中更详细地介绍。
| 配置文件 | 使用的格式 | 目的 |
rabbitmq.conf | 新样式格式(sysctl 或类 ini) | 主配置文件,扩展名为 |
advanced.config | 经典格式(Erlang 术语) | 少数无法在新样式配置格式中表示的设置,例如 LDAP 查询。仅在必要时使用。 |
rabbitmq-env.conf(Windows 上为 rabbitmq-env.conf.bat) | 环境变量对 | 用于在一个地方设置与 RabbitMQ 相关的 环境变量。 |
比较这个示例 rabbitmq.conf 文件
# A new style format snippet. This format is used by rabbitmq.conf files.
ssl_options.cacertfile = /path/to/ca_certificate.pem
ssl_options.certfile = /path/to/server_certificate.pem
ssl_options.keyfile = /path/to/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
更改为
%% A classic format snippet, now used by advanced.config files.
[
{rabbit, [{ssl_options, [{cacertfile, "/path/to/ca_certificate.pem"},
{certfile, "/path/to/server_certificate.pem"},
{keyfile, "/path/to/server_key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, true}]}]}
].
主配置文件 rabbitmq.conf
配置文件 rabbitmq.conf 允许配置 RabbitMQ 服务器和插件。该文件使用 sysctl 格式,与 advanced.config 和原始 rabbitmq.config(均使用 Erlang 术语格式)不同。
语法可以简要说明如下
- 一个设置占一行
- 行结构为
Key = Value - 以
#字符开头的任何内容都是注释 - 包含
#字符的值,例如生成的字符串、生成的密码、加密值等,可以用单引号转义,如下所示:'efd3!53a9@92#a08_d_6d' - 以
encrypted:为前缀的值被视为 加密值
一个极简的示例配置文件如下
# this is a comment
listeners.tcp.default = 5673
上面的示例等同于以下 经典配置格式
%% this is a comment
[
{rabbit, [
{tcp_listeners, [5673]}
]
}
].
此示例将把 RabbitMQ 监听 AMQP 0-9-1 和 AMQP 1.0 客户端连接的 端口 从 5672 更改为 5673。
一个使用值转义的极简示例
# this is a comment
default_user = '40696e180b610ed9'
default_pass = 'efd3!53a9@_2#a08'
这等同于以下 经典配置格式
%% this is a comment
[
{rabbit, [
{default_user, <<"40696e180b610ed9">>},
{default_pass, <<"efd3!53a9@_2#a08">>}
]
}
].
RabbitMQ 服务器源代码存储库包含 一个示例 rabbitmq.conf 文件,名为 rabbitmq.conf.example。它包含了您可能想要设置的大多数配置项的示例(省略了一些非常晦涩的),以及这些设置的文档。
网络、TLS 或 访问控制 等文档指南包含了许多相关格式的示例。
请注意,此配置文件不应与环境变量配置文件混淆,即 rabbitmq-env.conf 和 rabbitmq-env-conf.bat。
要覆盖主 RabbitMQ 配置文件位置,请使用 RABBITMQ_CONFIG_FILE(或 RABBITMQ_CONFIG_FILES 以使用 conf.d 风格的已排序文件目录)环境变量。对新样式配置文件格式使用 .conf 作为文件扩展名,例如 /etc/rabbitmq/rabbitmq.conf 或 /data/configuration/rabbitmq.conf
值转义
使用转义值的行不得包含任何(尤其是尾随)注释。请将任何必要的注释放在该行上方。
包含 # 字符的值,通常是机器生成的,可以用单引号转义
# escaping is not necessary here but may be a good idea for generated
# values
default_user = '7f11ddc4f1900a233964'
# escaping is important here as without it,
# the # character and everything that follows it would be
# considered a comment
default_pass = 'efd3!53a9@92#a08_d_6d'
使用 .conf 文件目录
也可以使用 conf.d 风格的文件目录。使用 RABBITMQ_CONFIG_FILES(注意是复数 "_FILES")将节点指向该文件目录
# uses a directory of .conf files loaded in alphabetical order
RABBITMQ_CONFIG_FILES=/path/to/a/custom/location/rabbitmq/conf.d
目标目录必须包含与 rabbitmq.conf 语法相同的多个 .conf 文件。
它们将按字母顺序加载。常见的命名实践使用数字前缀来方便理解顺序,或确保“默认文件”始终首先加载,无论部署时生成了多少额外文件。
ls -lh /path/to/a/custom/location/rabbitmq/conf.d
# => -r--r--r-- 1 rabbitmq rabbitmq 87B Mar 21 19:50 00-defaults.conf
# => -r--r--r-- 1 rabbitmq rabbitmq 4.6K Mar 21 19:52 10-main.conf
# => -r--r--r-- 1 rabbitmq rabbitmq 1.6K Mar 21 19:52 20-tls.conf
# => -r--r--r-- 1 rabbitmq rabbitmq 1.6K Mar 21 19:52 30-federation.conf
rabbitmq.conf 中的环境变量插值
现代 RabbitMQ 版本 支持 rabbitmq.conf 中的环境变量插值。例如,要覆盖默认用户凭据,可以使用 导入定义文件 或结合两个环境变量的以下配置文件
# environment variable interpolation
default_user = $(SEED_USERNAME)
default_pass = $(SEED_USER_PASSWORD)
环境变量可用于配置值的某一部分,例如群集名称
cluster_name = deployment-$(DEPLOYMENT_ID)
在解析和验证配置文件之前,环境变量值会作为字符串进行插值。这意味着它们可用于覆盖数值设置(如端口)或路径(如 TLS 证书和私钥路径)。
此外,RabbitMQ 遵循 一系列环境变量,以便在加载配置文件之前需要知道值。
advanced.config 文件
本节描述了已被 现代替代方案 取代的原始配置格式。
只有有限的功能和高级(或很少使用)的设置才需要使用此格式。当有此选项时,请使用 rabbitmq.conf。
使用 sysctl 格式配置某些配置设置是不可能的或困难的。因此,可以使用 Erlang 术语格式(与 rabbitmq.config 相同)的附加配置文件。该文件通常命名为 advanced.config。它将与 rabbitmq.conf 中提供的配置合并。
RabbitMQ 服务器源代码存储库包含 一个示例 advanced.config 文件,名为 advanced.config.example。它侧重于通常使用高级配置设置的选项。
要覆盖高级配置文件位置,请使用 RABBITMQ_ADVANCED_CONFIG_FILE 环境变量。
rabbitmq.conf, advanced.config 和 rabbitmq-env.conf 的位置
默认配置文件位置因发行版而异。RabbitMQ 软件包或节点不会创建任何配置文件。用户和部署工具应在创建文件时使用以下位置
| 平台 | 默认配置文件目录 | 示例配置文件路径 |
|
| |
|
| |
|
| |
|
| |
|
|
环境变量可用于覆盖配置文件位置
# overrides primary config file location
RABBITMQ_CONFIG_FILE=/path/to/a/custom/location/rabbitmq.conf
# overrides advanced config file location
RABBITMQ_ADVANCED_CONFIG_FILE=/path/to/a/custom/location/advanced.config
# overrides environment variable file location
RABBITMQ_CONF_ENV_FILE=/path/to/a/custom/location/rabbitmq-env.conf
配置文件的更改何时生效
rabbitmq.conf 和 advanced.config 的更改将在节点重启后生效。
如果 rabbitmq-env.conf 不存在,可以在 RABBITMQ_CONF_ENV_FILE 变量指定的位置手动创建。在 Windows 系统上,它名为 rabbitmq-env-conf.bat。
Windows 服务用户需要重新安装服务,如果配置文件位置或 rabbitmq-env-conf.bat 中的任何值已更改。否则,服务使用的环境变量将不会更新。
在自动化部署的背景下,这意味着 RABBITMQ_BASE 和 RABBITMQ_CONFIG_FILE 等环境变量最好在安装 RabbitMQ 之前设置。这将有助于避免不必要的混淆和 Windows 服务重新安装。
如何检查和验证运行中节点的有效配置
可以使用 rabbitmq-diagnostics environment 命令打印有效配置(来自所有合并到默认值中的配置文件的用户提供的值)
# inspect effective configuration on a node
rabbitmq-diagnostics environment
要检查特定节点(包括远程节点)的有效配置,请使用 -n(--node 的缩写)开关
rabbitmq-diagnostics environment -n [node name]
上面的命令将打印节点上运行的每个应用程序(RabbitMQ、插件、库)的应用配置。有效配置的计算步骤如下
rabbitmq.conf被翻译成内部使用的(高级)配置格式。这些配置被合并到默认值中- 如果存在,则加载
advanced.config,并合并到上一步的结果中
应与 配置文件位置 一起验证有效配置。结合这些步骤,可以快速缩小最常见的配置错误问题范围。
rabbitmq.config(经典格式)文件
在 RabbitMQ 3.7.0 之前,RabbitMQ 配置文件名为 rabbitmq.config,并使用 与今天 advanced.config 相同的 Erlang 术语格式。该格式仍然支持 向后兼容。
经典格式已弃用。请优先使用 rabbitmq.conf 中的 新样式配置格式,并根据需要配合 advanced.config 文件。
要使用经典格式的配置文件,请将 RABBITMQ_CONFIG_FILE 导出到指向具有 .config 扩展名的文件。该扩展名将指示 RabbitMQ 将该文件视为经典配置格式。
一个名为 rabbitmq.config.example 的示例配置文件。它包含经典配置格式中大多数配置项的示例。
要覆盖主 RabbitMQ 配置文件位置,请使用 RABBITMQ_CONFIG_FILE 环境变量。对于经典配置格式,请使用 .config 作为文件扩展名。
经典配置格式的使用应仅限于 advanced.config 文件 和无法使用 ini 样式配置文件 配置的设置。
示例配置文件
RabbitMQ 服务器源代码存储库包含配置文件的示例
这些文件包含大多数配置键的示例,以及对这些设置的简要说明。所有配置项在示例中都被注释掉了,您可以取消注释您需要的项。请注意,示例文件应仅作为示例使用,不应被视为通用建议。
在大多数发行版中,示例文件被放置在与实际文件应放置的位置相同的地方(参见上文)。在 Debian 和 RPM 发行版中,策略禁止这样做;相反,请在 /usr/share/doc/rabbitmq-server/ 或 /usr/share/doc/rabbitmq-server-4.2.0/ 下查找该文件。
rabbitmq.conf 中可配置的核心服务器变量
这些变量是最常见的。列表不完整,因为有些设置非常晦涩。
| 键 | 文档 |
|---|---|
listeners.tcp | 用于“纯”AMQP 0-9-1 和 AMQP 1.0 连接(无 TLS)监听的端口或主机名/对。有关更多详细信息和示例,请参阅 网络指南。 默认 |
listeners.ssl | 用于 TLS 启用的 AMQP 0-9-1 和 AMQP 1.0 连接监听的端口或主机名/对。有关更多详细信息和示例,请参阅 TLS 指南。 默认: none(未设置) |
ssl_options | TLS 配置。请参阅 TLS 指南。 默认 |
num_acceptors.tcp | 将接受 TCP 监听器连接的 Erlang 进程数。 默认 |
num_acceptors.ssl | 将接受客户端 TLS 连接的 Erlang 进程数。 默认 |
distribution.listener.interface | 控制将使用哪个网络接口与群集成员和 CLI 工具进行通信。 默认 |
distribution.listener.port_range.min | 控制将用于与群集成员和 CLI 工具通信的服务器端口范围的下限。 默认 |
distribution.listener.port_range.max | 控制将用于与群集成员和 CLI 工具通信的服务器端口范围的上限。 默认 |
handshake_timeout | AMQP 0-9-1 握手的最长时间(在套接字连接和 TLS 握手之后),以毫秒为单位。 默认 |
ssl_handshake_timeout | TLS 握手超时,以毫秒为单位。 默认 |
vm_memory_high_watermark | 触发流控制的内存阈值。可以是绝对值,也可以是相对于操作系统可用内存的比例。 默认 |
vm_memory_calculation_strategy | 内存使用报告策略。可以是以下之一:
默认 |
total_memory_available_override_value | 允许覆盖可用总内存量,而不是通过特定于操作系统的手段从环境中推断。这仅应在节点实际可用的最大 RAM 量与节点将推断的值不匹配时使用,例如由于节点无法感知的容器化或类似限制。该值可以设置为整数字节数,或者以信息单位(例如 默认: |
disk_free_limit | RabbitMQ 存储数据的分区的可用磁盘空间限制。当可用磁盘空间低于此限制时,将触发流控制。该值可以设置为相对于总 RAM 量,或设置为字节的绝对值,或者以信息单位(例如 默认情况下,空闲磁盘空间必须超过 50MB。这必须重新审视以用于 生产环境。请参阅 磁盘警报 文档。 默认 |
queue_leader_locator | 控制在声明新队列或流时,用于选择托管首领副本的节点的 策略。 |
log.file.level | 控制日志记录的粒度。该值是日志事件类别和日志级别对的列表。 级别可以是以下之一: 默认 |
session_max_per_connection | AMQP 1.0 连接上可同时激活的最大 AMQP 1.0 会话数。 默认:
64最小值:
1最大值: 65535 |
link_max_per_session | AMQP 1.0 会话上可同时激活的最大 AMQP 1.0 链接数。 默认:
256最小值:
1最大值: 4294967295 |
channel_max | 允许与客户端协商的最大通道数,不包括协议中使用的特殊通道号 0。设置为 0 表示“无限制”,这是一个危险的值,因为应用程序有时会有通道泄露。使用更多通道会增加代理的内存占用。 默认 |
channel_operation_timeout | 通道操作超时(以毫秒为单位)(内部使用,由于消息协议差异和限制,不直接暴露给客户端)。 默认 |
max_message_size | 允许的最大消息负载大小(以字节为单位)。大于此大小的消息将被拒绝并出现适当的通道异常。 默认:
16777216最大值: 536870912 |
heartbeat | 表示服务器在连接参数协商期间建议的心跳超时值。如果在两端都设置为 0,则会禁用心跳(不推荐)。有关详细信息,请参阅 心跳指南。 默认 |
default_vhost | 当 RabbitMQ 从头开始创建新数据库时创建的虚拟主机。 默认 |
default_user | 当 RabbitMQ 从头开始创建新数据库时创建的用户名。 默认 |
default_pass | 默认用户的密码。 默认 |
default_user_tags | 默认用户的标签。 默认 |
default_permissions | 创建默认用户时分配给它的 权限。 默认 |
loopback_users | 仅允许通过环回接口(即 要允许默认的 要将其他用户限制为仅本地连接,请按以下方式操作( 默认 |
cluster_formation.classic_config.nodes | 经典 节点发现 后端的节点联系列表。 例如,首次启动时与节点 默认: none(未设置) |
collect_statistics | 统计信息收集模式。主要与管理插件相关。选项是:
默认 |
collect_statistics_interval | 统计信息收集间隔(以毫秒为单位)。主要与 管理插件 相关。 默认 |
management.db_cache_multiplier | 影响 管理插件 缓存昂贵管理查询(如队列列表)的时间。 缓存会将最后一次查询的经过时间乘以此值,并将结果缓存计算出的时间。 默认 |
auth_mechanisms | SASL 身份验证机制 提供给客户端。 默认 |
auth_backends | 除了 默认 |
reverse_dns_lookups | 设置为 默认 |
delegate_count | 用于群集内通信的委托进程数。在一台拥有大量核心且也是群集一部分的机器上,您可能希望增加此值。 默认 |
tcp_listen_options | 默认套接字选项。当您对网络问题进行故障排除时,可能需要更改它们。 默认 将 将 |
cluster_partition_handling | 如何处理网络分区。可用模式是:
有关更多信息,请参阅 分区文档。 默认 |
cluster_keepalive_interval | 节点应以多快的频率向其他节点发送 Keepalive 消息(以毫秒为单位)。请注意,这与 默认 |
queue_index_embed_msgs_below | 消息的大小(以字节为单位),低于此值时,消息将直接嵌入队列索引中。建议您在更改此设置之前阅读 持久化调优 文档。 默认 |
mnesia_table_loading_retry_timeout | 等待集群中的 Mnesia 表可用时使用的超时。 默认 |
mnesia_table_loading_retry_limit | 群集启动时等待 Mnesia 表的重试次数。请注意,此设置不适用于 Mnesia 升级或节点删除。 默认 |
queue_leader_locator | 队列首领定位策略。可用策略是:
默认 |
proxy_protocol | 如果设置为 有关更多信息,请参阅 网络指南。 默认 |
cluster_name | 操作员控制的群集名称。此名称用于标识群集,并由 federation 和 Shovel 插件用于记录传输消息的来源或路径。可以设置为任何任意字符串来帮助标识群集(例如 默认:默认情况下,该名称是从群集中的第一个(种子)节点派生的。 |
node_tags | 可选节点标签(键值对)的映射。 |
以下配置设置只能在 高级配置文件 中,在 rabbit 部分下设置。
| 键 | 文档 |
|---|---|
backing_queue_module | 队列内容的实现模块。 默认 |
msg_store_file_size_limit | 消息存储段文件大小。更改具有现有(已初始化)数据库的节点的此设置是危险的,可能导致数据丢失! 默认: |
trace_vhosts | 由 tracer 内部使用。您不应更改此项。 默认 |
queue_index_max_journal_entries | 队列索引日志条目达到多少条后会刷新到磁盘。 默认 |
RabbitMQ 附带的几个 插件 都有专门的文档指南,涵盖插件配置
- rabbitmq_management
- rabbitmq_management_agent
- rabbitmq_stomp
- rabbitmq_mqtt
- rabbitmq_shovel
- rabbitmq_federation
- rabbitmq_auth_backend_ldap
- rabbitmq_auth_backend_oauth
群集和节点元数据
集群名称
默认情况下,群集名称设置为群集中第一个节点的名称。
可以通过 rabbitmq.conf 覆盖它
cluster_name = americas.ca.1
RabbitMQ 在 管理 UI 中显示此值。
还可以通过 列出全局运行时参数 和 GET /api/global-parameters/cluster_name HTTP API 端点 来检查它。
群集标签
群集标签是描述群集的任意键值对。操作员可以使用它们来附加部署特定信息。
可以使用 rabbitmq.conf 配置群集标签
cluster_tags.series = 4.1.x
cluster_tags.purpose = iot_ingress
cluster_tags.region = ca-central-1
cluster_tags.environment = production
要检索标签列表,请列出 全局运行时参数 或获取名为 cluster_tags 的全局运行时参数,或者使用 rabbitmqadmin v2 的 snow overview 命令。
- rabbitmqadmin v2
- bash
- PowerShell
- HTTP API
rabbitmqadmin show overview
# lists global (virtual-host-independent) runtime parameters
rabbitmqctl list_global_parameters
# lists global (virtual-host-independent) runtime parameters
rabbitmqctl.bat list_global_parameters
GET /api/global-parameters
GET /api/global-parameters/cluster_tags
节点标签
节点标签
与群集标签类似,节点标签也可以通过 rabbitmq.conf 预先配置
node_tags.series = 4.1.x
node_tags.purpose = iot_ingress
node_tags.region = ca-central-1
node_tags.environment = production
可以使用 CLI 工具和 HTTP API 来检查节点标签。
- rabbitmqadmin v2
- bash
- PowerShell
- HTTP API
rabbitmqadmin show overview
rabbitmq-diagnostics status
rabbitmq-diagnostics.bat status
GET /api/overview
配置值加密
敏感的 advanced.config 和选定的 rabbitmq.conf 条目(例如密码、包含凭据的 URL)可以加密。然后 RabbitMQ 节点在启动时解密加密的条目。
加密的配置条目不会使系统完全安全。
但是,它们允许 RabbitMQ 部署符合许多国家/地区的法规要求,即不应在配置文件中以纯文本形式出现敏感数据。
要使用加密值,需要执行几个步骤:
- 生成唯一的密码
- 使用
rabbitmqctl encrypt_conf_value(用于rabbitmq.conf)或rabbitmqctl encode(用于advanced.config)加密值 - 使用 CLI 生成的值更新
rabbitmq.conf或advanced.config - 在
advanced.config中指定解码器的密码
使用 CLI 工具加密值
使用 rabbitmqctl encrypt_conf_value for rabbitmq.conf
使用 rabbitmqctl 和 encrypt_conf_value 命令来加密将在 rabbitmq.conf 中使用的值
- bash
- PowerShell
# <<"guest">> here is a value to encode, as an Erlang binary,
# to which many rabbitmq.conf string values are translated
rabbitmqctl -s encrypt_conf_value '<<"guest">>' mypassphrase
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# to which some rabbitmq.conf string values are translated
rabbitmqctl -s encrypt_conf_value '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
# <<"guest">> here is a value to encode, as an Erlang binary,
# to which many rabbitmq.conf string values are translated
rabbitmqctl.bat -s encrypt "<<""guest"">>" mypassphrase
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# to which some rabbitmq.conf string values are translated
rabbitmqctl.bat -s encrypt '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
使用 rabbitmqctl encode for advanced.config
使用 rabbitmqctl 和 encode 命令来加密将在 advanced.config 中使用的值
- bash
- PowerShell
# <<"guest">> here is a value to encode, as an Erlang binary,
# as it would have appeared in advanced.config
rabbitmqctl encode '<<"guest">>' mypassphrase
# => {encrypted,<<"... long encrypted value...">>}
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# as it would have appeared in advanced.config
rabbitmqctl encode '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => {encrypted,<<"... long encrypted value...">>}
# <<"guest">> here is a value to encode, as an Erlang binary,
# as it would have appeared in advanced.config
rabbitmqctl.bat encode "<<""guest"">>" mypassphrase
# => {encrypted,<<"... long encrypted value...">>}
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# as it would have appeared in advanced.config
rabbitmqctl.bat encode '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => {encrypted,<<"... long encrypted value...">>}
rabbitmq.conf 中的加密值
在 rabbitmq.conf 中,某些键的值可以加上 encrypted 前缀,例如:encrypted:3sPKxdusd。
这些键是:
ssl_options.passworddefault_passworddefault_user.$username.passworddefinitions.tls.passwordanonymous_login_pass
其他键不支持 encrypted:{value} 值。
要加密要在 rabbitmq.conf 中使用的值,请使用 rabbitmqctl -s encrypt_conf_value
- bash
- PowerShell
# <<"guest">> here is a value to encode, as an Erlang binary,
# to which many rabbitmq.conf string values are translated
rabbitmqctl -s encrypt_conf_value '<<"guest">>' mypassphrase
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# to which some rabbitmq.conf string values are translated
rabbitmqctl -s encrypt_conf_value '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => encrypted:3sPKxdusdbENvruAtF+Qtr71cEnZwE7nG/uqiakPyzEJsycJlyAKOKq4TSq2kDrl
# <<"guest">> here is a value to encode, as an Erlang binary,
# as it would have appeared in advanced.config
rabbitmqctl.bat encode "<<""guest"">>" mypassphrase
# => {encrypted,<<"... long encrypted value...">>}
# "amqp://fred:secret@host1.domain/my_vhost" here is a value to encode, provided as an Erlang string,
# as it would have appeared in advanced.config
rabbitmqctl.bat encode '"amqp://fred:secret@host1.domain/my_vhost"' "mypassphrase"
# => {encrypted,<<"... long encrypted value...">>}
为解码器指定密码
当 rabbitmq.conf 中的值被加密时,密码仍然在 advanced.config 中配置
[
{rabbit, [
{config_entry_decoder, [
{passphrase, <<"mypassphrase">>}
]}
]}
].
从 advanced.config 迁移到 rabbitmq.conf
我们最初为 advanced.config 加密的值可以移动到 rabbitmq.conf。
rabbitmqctl encode 会为 advanced.config 生成 {encrypted, Value} 对。它们必须转换为更简单的格式才能在 rabbitmq.conf 中使用。
例如,如果 rabbitmqctl encode 生成以下输出
{encrypted, <<"P1Vbf81vsU3QogIxSDlllHcsj+23Wy9vp9/Eyl14NRROqHjJRKdwsShyWqMSESMF">>}
此值必须在 rabbitmq.conf 中如此指定
default_user = guest
# An equivalent of {encrypted, <<"P1Vbf81vsU3QogIxSDlllHcsj+23Wy9vp9/Eyl14NRROqHjJRKdwsShyWqMSESMF">>}
# in advanced.config
default_password = encrypted:P1Vbf81vsU3QogIxSDlllHcsj+23Wy9vp9/Eyl14NRROqHjJRKdwsShyWqMSESMF
advanced.config 中的加密值
这里是一个包含默认用户加密密码的配置文件示例
[
{rabbit, [
{default_user, <<"guest">>},
{default_pass,
{encrypted,
<<"cPAymwqmMnbPXXRVqVzpxJdrS8mHEKuo2V+3vt1u/fymexD9oztQ2G/oJ4PAaSb2c5N/hRJ2aqP/X0VAfx8xOQ==">>
}
},
{config_entry_decoder, [
{passphrase, <<"mypassphrase">>}
]}
]}
].
config_entry_decoder.passphrase 键控制 RabbitMQ 用于解密加密值的密码。
密码不必硬编码在配置文件中,它可以放在一个单独的文件中
[
{rabbit, [
%% ...
{config_entry_decoder, [
{passphrase, {file, "/path/to/passphrase/file"}}
]}
]}
].
RabbitMQ 还可以通过使用 {passphrase, prompt} 来请求操作员在启动时输入密码。
使用 CLI 工具解密值
使用 decode 命令解密值
- bash
- PowerShell
rabbitmqctl decode '{encrypted, <<"...">>}' mypassphrase
# => <<"guest">>
rabbitmqctl decode '{encrypted, <<"...">>}' mypassphrase
# => "amqp://fred:secret@host1.domain/my_vhost"
rabbitmqctl.bat decode "{encrypted, <<""..."">>}" "mypassphrase"
# => <<"guest">>
rabbitmqctl.bat decode "{encrypted, <<""..."">>}" "mypassphrase"
# => "amqp://fred:secret@host1.domain/my_vhost"
可以对不同类型的值进行编码。
上面的示例对二进制(<<"guest">>)和字符串("amqp://fred:secret@host1.domain/my_vhost")都进行了编码。
加密设置:密码、哈希函数、迭代次数
加密机制使用 PBKDF2 从密码生成派生密钥。默认哈希函数为 SHA512,默认迭代次数为 1000。默认密码为 AES 256 CBC。
这些默认值可以在配置文件中更改
[
{rabbit, [
...
{config_entry_decoder, [
{passphrase, "mypassphrase"},
{cipher, blowfish_cfb64},
{hash, sha256},
{iterations, 10000}
]}
]}
].
如果任何值被覆盖,则在加密值时必须使用等效值,方法是使用 CLI 工具
- bash
- PowerShell
# --cipher, --hash and --iterations must match their counterparts un `config_entry_decoder`
# in `advanced.config`
rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 10000 \
'<<"guest">>' mypassphrase
# --cipher, --hash and --iterations must match their counterparts un `config_entry_decoder`
# in `advanced.config`
rabbitmqctl.bat encode --cipher blowfish_cfb64 --hash sha256 --iterations 10000 \
"<<""guest"">>" mypassphrase
使用环境变量配置
某些服务器参数可以通过环境变量进行配置:节点名称、RabbitMQ 配置文件位置、节点间通信端口、Erlang VM 标志等。
目录和路径限制
一些环境变量配置路径和位置(节点的基目录或数据目录、插件 源目录和扩展目录等)。这些路径必须排除一些字符:
*和?(在 Linux、macOS、BSD 和其他类 UNIX 系统上)^和!(在 Windows 上)[和]{和}
上述字符将导致节点无法启动或无法按预期工作(例如,无法扩展插件并加载其元数据)。
Linux、MacOS、BSD
在类 UNIX 系统(Linux、MacOS 和 BSD 各版本)上,可以使用一个名为 rabbitmq-env.conf 的文件来定义代理使用的环境变量。其 位置 可以通过 RABBITMQ_CONF_ENV_FILE 环境变量进行配置。
rabbitmq-env.conf 使用标准的环境变量名称,但省略 RABBITMQ_ 前缀。例如,RABBITMQ_CONFIG_FILE 变量在此处显示为 CONFIG_FILE,而 RABBITMQ_NODENAME 变为 NODENAME。
# Example rabbitmq-env.conf file entries. Note that the variables
# do not have the RABBITMQ_ prefix.
#
# Overrides node name
NODENAME=bunny@myhost
# Specifies new style config file location
CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf
# Specifies advanced config file location
ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config
有关详细信息,请参阅 rabbitmq-env.conf man page。
Windows
自定义名称、端口或位置的最简单方法是在 Windows 对话框中配置环境变量:开始 > 设置 > 控制面板 > 系统 > 高级 > 环境变量。然后创建或编辑系统变量名称和值。
或者,可以使用一个名为 rabbitmq-env-conf.bat 的文件来定义代理使用的环境变量。其 位置 可以通过 RABBITMQ_CONF_ENV_FILE 环境变量进行配置。
Windows 服务用户需要重新安装服务,如果配置文件位置或 rabbitmq-env-conf.bat 中的任何值已更改。否则,服务使用的环境变量将不会更新。
这可以使用安装程序或在具有管理员权限的命令行中完成
- 启动一个管理员命令提示符
- cd 进入 RabbitMQ 服务器安装目录下的 sbin 文件夹(例如
C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-{version}\sbin) - 运行
rabbitmq-service.bat stop停止服务 - 运行
rabbitmq-service.bat remove删除 Windows 服务(这不会删除 RabbitMQ 或其数据目录) - 通过命令行设置环境变量,例如运行以下命令
set RABBITMQ_BASE=C:\Data\RabbitMQ - 运行
rabbitmq-service.bat install - 运行
rabbitmq-service.bat start
这将以一种使环境变量和 rabbitmq-env-conf.bat 更改对其可见的方式重新启动节点。
RabbitMQ 使用的环境变量
RabbitMQ 使用的所有环境变量都带有 RABBITMQ_ 前缀(在 rabbitmq-env.conf 或 rabbitmq-env-conf.bat 中定义时除外)。
在 shell 环境中设置的环境变量优先于在 rabbitmq-env.conf 或 rabbitmq-env-conf.bat 中设置的环境变量,而后者又覆盖 RabbitMQ 的内置默认值。
下表描述了可用于配置 RabbitMQ 的关键环境变量。更多变量在 文件和目录位置指南 中介绍。
| 名称 | 描述 |
|---|---|
| RABBITMQ_NODE_IP_ADDRESS | 如果您只想绑定到一个网络接口,请更改此项。可以在配置文件中设置绑定到两个或多个接口。 默认:空字符串,表示“绑定到所有网络接口”。 |
| RABBITMQ_NODE_PORT | 有关 RabbitMQ 各部分使用的端口的更多信息,请参阅 网络指南。 默认: 5672. |
| RABBITMQ_DIST_PORT | 用于节点间和 CLI 工具通信的端口。如果节点配置文件设置了 默认: |
| ERL_MAX_PORTS | 此限制对应于内核中的 最大打开文件句柄限制。当后者设置为高于 65536 的值时,必须相应地调整 默认: 65536 |
| ERL_EPMD_ADDRESS | 节点间和 CLI 工具通信的组件 epmd 使用的接口。 默认:所有可用接口,包括 IPv6 和 IPv4。 |
| ERL_EPMD_PORT | 节点间和 CLI 工具通信的组件 epmd 使用的端口。 默认: |
| RABBITMQ_DISTRIBUTION_BUFFER_SIZE | 用于节点间通信连接的 出站数据缓冲区大小限制(以 KB 为单位)。不建议使用低于 64 MB 的值。 默认: 128000 |
| RABBITMQ_NODENAME | 节点名称在每个 Erlang 节点和机器组合上都应是唯一的。要运行多个节点,请参阅 群集指南。 默认:
|
| RABBITMQ_CONFIG_FILE | 主 RabbitMQ 配置文件路径,例如,新样式配置文件格式的文件为 默认:
|
| RABBITMQ_CONFIG_FILES | 指向新样式(.conf)格式的 RabbitMQ 配置文件目录的路径。文件将按字母顺序加载。在每个文件前面加上数字前缀是一种常见做法。 默认:
|
| RABBITMQ_ADVANCED_CONFIG_FILE | “高级”(基于 Erlang 术语)RabbitMQ 配置文件路径,扩展名为 默认:
|
| RABBITMQ_CONF_ENV_FILE | 包含环境变量定义的文件位置(不带 默认:
|
| RABBITMQ_LOG_BASE | 可用于覆盖日志文件目录位置。 默认:
|
| RABBITMQ_MNESIA_BASE | 此基目录包含 RabbitMQ 服务器节点数据库、消息存储和群集状态文件的子目录,每个节点一个,除非显式设置了 RABBITMQ_MNESIA_DIR。重要的是,有效的 RabbitMQ 用户在此目录中拥有随时读取、写入和创建文件和子目录的足够权限。此变量通常不被覆盖。通常会覆盖 默认:
|
| RABBITMQ_MNESIA_DIR | 存储此 RabbitMQ 节点数据的目录。这包括架构数据库、消息存储、群集成员信息和其他持久性节点状态。 默认:
|
| RABBITMQ_PLUGINS_DIR | 查找和解压 插件 存档文件的目录列表。这是一个类似 默认:
|
| RABBITMQ_PLUGINS_EXPAND_DIR | 节点解压(解包)插件 并将其用作代码路径位置的目录。不得包含 路径限制部分 中提到的任何字符。 默认:
|
| RABBITMQ_USE_LONGNAME | 设置为 默认: |
| RABBITMQ_SERVICENAME | 已安装的 Windows 服务的名称。这会显示在 默认:RabbitMQ。 |
| RABBITMQ_CONSOLE_LOG | 将此变量设置为
默认:(无) |
| RABBITMQ_SERVER_CODE_PATH | 启动运行时时要指定的额外代码路径(目录)。启动节点时将传递给 默认:(无) |
| RABBITMQ_CTL_ERL_ARGS | 调用 默认:(无) |
| RABBITMQ_SERVER_ERL_ARGS | 调用 RabbitMQ 服务器时使用的 危险 设置此变量将替换 RabbitMQ 提供的默认值。 提示 考虑使用 默认:
|
| RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS | 调用 RabbitMQ 服务器时使用的 默认:
|
| RABBITMQ_SERVER_START_ARGS | 调用 RabbitMQ 服务器时使用的 默认:(无) |
| RABBITMQ_DEFAULT_USER | 此环境变量仅用于开发和 CI 环境。它的含义与 默认:(无) |
| RABBITMQ_DEFAULT_PASS | 此环境变量仅用于开发和 CI 环境。它的含义与 默认:(无) |
| RABBITMQ_DEFAULT_VHOST | 此环境变量仅用于开发和 CI 环境。它的含义与 默认:(无) |
| RABBITMQ_MAX_OPEN_FILES | 重要 此变量不是配置 最大打开文件句柄限制 的主要方法。 如果设置,启动脚本将设置 RabbitMQ 可用的文件描述符限制(它们将使用提供的值执行 如果 默认:(无) |
除了上面列出的变量之外,还有几个环境变量告诉 RabbitMQ 在哪里查找其数据库、日志文件、插件、配置文件等。
最后,一些环境变量是特定于操作系统的。
| 名称 | 描述 |
|---|---|
| HOSTNAME | 当前机器的名称。 默认:
|
| COMPUTERNAME | 当前机器的名称。 默认:
|
| ERLANG_SERVICE_MANAGER_PATH | 此路径是 默认:
|
操作系统内核限制
大多数操作系统对内核资源强制执行限制:虚拟内存、堆栈大小、打开的文件句柄等。对于 Linux 用户,这些限制可以称为“ulimit 限制”。
RabbitMQ 节点最常受到最大 打开文件句柄限制 的影响。大多数 Linux 发行版的默认值通常是 1024,这对于消息代理(或一般任何数据服务)来说非常低。有关建议值,请参阅 部署指南。
修改限制
使用 systemd(现代 Linux 发行版)
在使用 systemd 的发行版上,操作系统限制通过 /etc/systemd/system/rabbitmq-server.service.d/limits.conf 的配置文件进行控制。例如,要将最大打开文件句柄限制(nofile)设置为 64000:
[Service]
LimitNOFILE=64000
有关支持的限制和其他指令的信息,请参阅systemd 文档。
使用 Docker
要为 Docker 容器配置内核限制,请在 Docker 守护进程配置文件 中使用 "default-ulimits" 键。该文件必须安装在 Docker 主机上的 /etc/docker/daemon.json
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
未使用 systemd(旧版 Linux 发行版)
在不使用 systemd 的发行版上调整 RabbitMQ 每个用户限制的最直接方法是编辑 /etc/default/rabbitmq-server(由 RabbitMQ Debian 包提供)或 rabbitmq-env.conf,以便在服务启动前调用 ulimit。
ulimit -S -n 4096
此软限制不能高于硬限制(在许多发行版中默认为 4096)。可以通过 /etc/security/limits.conf 增加硬限制。这还需要启用 pam_limits.so 模块并重新登录或重启。
请注意,无法更改正在运行的 OS 进程的限制。