配置
概述
RabbitMQ 附带默认的内置设置。在某些环境(例如开发和 QA)中,这些设置可能完全足够。对于所有其他情况,以及生产部署调优,有一种方法可以配置 broker 中的许多内容以及插件。
本指南涵盖了与配置相关的多个主题
- 不同方式,服务器和插件的各种设置在其中配置
- 配置文件:主要的 rabbitmq.conf 或 .conf 文件目录,以及可选的 advanced.config
- 各种平台上的默认配置文件位置
- 配置故障排除:如何查找配置文件位置以及检查和验证有效配置
rabbitmq.conf
中的环境变量插值- RabbitMQ 节点使用的环境变量
- 操作系统(内核)限制
- 可用的核心服务器设置
- 可用的环境变量
- 如何加密敏感配置值
等等。
由于配置会影响系统的许多领域,包括插件,因此各个文档指南会更深入地探讨可以配置的内容。运行时调优是本指南的配套,重点介绍运行时中可配置的参数。部署指南是一个相关指南,概述了在大多数生产环境中可能需要调优的设置。
配置方式
RabbitMQ 节点可以使用多种机制进行配置,这些机制负责不同的领域
机制 | 描述 |
包含服务器和插件设置,用于 TCP 监听器和其他网络相关设置、TLS、资源约束(告警)、身份验证和授权后端、消息存储设置等等。 | |
用于定义节点名称、文件和目录位置、从 shell 获取的运行时标志,或在环境配置文件 | |
当使用内部身份验证/授权后端时, | |
| |
| |
| |
定义集群范围的设置,这些设置可以在运行时更改,以及为队列组(交换机等)配置的便捷设置,例如包括可选的队列参数。 | |
控制系统的底层方面:内存分配设置、节点间通信缓冲区大小、运行时调度器设置等等。 | |
控制内核强制执行的进程限制:最大打开文件句柄限制、最大进程数和内核线程数、最大常驻集大小等等。 |
大多数设置使用前两种方法配置。因此,本指南重点介绍它们。
配置文件
简介
虽然 RabbitMQ 中的某些设置可以使用环境变量进行调整,但大多数设置都是使用名为 rabbitmq.conf
的主配置文件进行配置的。
这包括核心服务器以及插件的配置。可以使用额外的配置文件来配置无法在主文件的配置格式中表达的设置。这将在下面更详细地介绍。
以下部分介绍了这两个文件的语法和位置,在哪里可以找到示例等等。
配置文件位置
本主题将在本指南的其余部分中更详细地介绍。
当对 RabbitMQ 配置文件位置有疑问时,请查阅日志文件和/或管理 UI,如下节所述。
如何查找配置文件位置
可以通过检查 RabbitMQ 日志文件来验证活动配置文件。它将显示在日志文件的顶部,以及其他 broker 启动日志条目。例如
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'
以下是一个最小化的示例配置文件
# this is a comment
listeners.tcp.default = 5673
上面的示例等效于以下经典配置格式
%% this is a comment
[
{rabbit, [
{tcp_listeners, [5673]}
]
}
].
此示例将 AMQP 0-9-1 和 AMQP 1.0 客户端连接的 RabbitMQ 监听端口从 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.example
的rabbitmq.conf 示例文件。它包含您可能想要设置的大多数配置项的示例(省略了一些非常晦涩的项),以及这些设置的文档。
文档指南,例如网络、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/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
目标目录必须包含多个 .conf
文件,其语法与 rabbitmq.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.example
的 advanced.config 示例文件。它侧重于通常使用高级配置设置的选项。
要覆盖高级配置文件位置,请使用 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
。
如果 rabbitmq-env-conf.bat
中的配置文件位置或任何值已更改,Windows 服务用户将需要重新安装服务。否则,服务使用的环境变量将不会更新。
在部署自动化的上下文中,这意味着 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.1.0/
下查找该文件。
rabbitmq.conf 中可配置的核心服务器变量
这些变量是最常见的。该列表并不完整,因为某些设置非常晦涩。
键 | 文档 |
---|---|
listeners.tcp | 用于监听 “plain” AMQP 0-9-1 和 AMQP 1.0 连接(不带 TLS)的端口或主机名/对。有关更多详细信息和示例,请参见网络指南。 默认
|
listeners.ssl | 用于监听启用 TLS 的 AMQP 0-9-1 和 AMQP 1.0 连接的端口或主机名/对。有关更多详细信息和示例,请参见TLS 指南。 默认值: |
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 | 触发流量控制的内存阈值。可以是绝对值或相对于操作系统可用的 RAM 量
默认
|
vm_memory_calculation_strategy | 内存使用情况报告的策略。可以是以下之一
默认
|
total_memory_available_override_value | 可以覆盖可用内存总量,而不是使用特定于操作系统的方式从环境中推断出来。这仅应在节点可用的实际最大 RAM 量与节点将推断出的值不匹配时使用,例如,由于容器化或类似的约束,节点无法意识到。该值可以设置为整数字节数,或者以信息单位表示(例如 默认值: |
disk_free_limit | RabbitMQ 存储数据的分区上的可用磁盘空间限制。当可用磁盘空间低于此限制时,将触发流量控制。该值可以相对于 RAM 总量设置,也可以设置为字节为单位的绝对值,或者以信息单位表示(例如
默认情况下,可用磁盘空间必须超过 50MB。必须为生产环境重新审视这一点。请参见磁盘告警文档。 默认
|
queue_leader_locator | 控制在选择节点以托管新声明的队列或流的 leader 副本时使用的策略。 |
log.file.level | 控制日志记录的粒度。该值是日志事件类别和日志级别对的列表。 级别可以是 默认
|
session_max_per_connection | AMQP 1.0 连接上可以同时处于活动状态的 AMQP 1.0 会话的最大数量。 默认值: 最小值: 最大值: |
link_max_per_session | AMQP 1.0 会话上可以同时处于活动状态的 AMQP 1.0 链接的最大数量。 默认值: 最小值: 最大值: |
channel_max | 与客户端协商的最大允许通道数,不包括协议中使用的特殊通道号 0。设置为 0 表示“无限制”,这是一个危险的值,因为应用程序有时会发生通道泄漏。使用更多通道会增加 broker 的内存占用。 默认
|
channel_operation_timeout | 通道操作超时时间,以毫秒为单位(内部使用,由于消息传递协议的差异和限制,不直接向客户端公开)。 默认
|
max_message_size | 允许的最大消息有效负载大小(以字节为单位)。大于此大小的消息将被拒绝,并出现合适的通道异常。 默认值: 最大值: |
heartbeat | 表示服务器在连接参数协商期间建议的心跳超时值。如果在两端都设置为 0,则心跳将被停用(不建议这样做)。有关详细信息,请参见心跳指南。 默认
|
default_vhost | 当 RabbitMQ 从头开始创建新数据库时要创建的虚拟主机。交换机 默认
|
default_user | 当 RabbitMQ 从头开始创建新数据库时要创建的用户名。 默认
|
default_pass | 默认用户的密码。 默认
|
default_user_tags | 默认用户的标签。 默认
|
default_permissions | 在创建默认用户时要分配给它的权限。 默认
|
loopback_users | 仅允许通过环回接口(即 要允许默认
要将另一个用户限制为仅限 localhost 连接,请执行以下操作(
默认
|
cluster_formation.classic_config.nodes | 经典对等发现后端的要联系的节点列表。 例如,要在首次启动时与节点
默认值: |
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 | 队列 leader 位置策略。可用策略包括
默认
|
proxy_protocol | 如果设置为 有关更多信息,请参见网络指南。 默认
|
cluster_name | 操作员控制的集群名称。此名称用于标识集群,并被 federation 和 Shovel 插件用于记录传输消息的来源或路径。 可以设置为任何任意字符串以帮助识别集群(例如 默认值:默认情况下,名称从集群中的第一个(种子)节点派生。 |
以下配置设置只能在 高级配置文件 中的 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
配置值加密
敏感的 advanced.config
条目(例如,密码,包含凭据的 URL)可以加密。 然后,RabbitMQ 节点在启动时解密加密的条目。
请注意,加密的配置条目并不能使系统更安全。 然而,它们允许 RabbitMQ 的部署符合许多国家/地区的法规,这些法规要求敏感数据不得以明文形式出现在配置文件中。
加密值必须在 Erlang encrypted
元组内: {encrypted, ...}
。 这是一个配置文件示例,其中包含默认用户的加密密码
[
{rabbit, [
{default_user, <<"guest">>},
{default_pass,
{encrypted,
<<"cPAymwqmMnbPXXRVqVzpxJdrS8mHEKuo2V+3vt1u/fymexD9oztQ2G/oJ4PAaSb2c5N/hRJ2aqP/X0VAfx8xOQ==">>
}
},
{config_entry_decoder, [
{passphrase, <<"mypassphrase">>}
]}
]}
].
请注意带有口令的 config_entry_decoder
键,RabbitMQ 将使用该口令来解密加密值。
口令不必硬编码在配置文件中,它可以放在单独的文件中
[
{rabbit, [
%% ...
{config_entry_decoder, [
{passphrase, {file, "/path/to/passphrase/file"}}
]}
]}
].
RabbitMQ 也可以在启动时通过使用 {passphrase, prompt}
请求操作员输入口令。
使用 CLI 工具加密 advanced.config 值
使用 rabbitmqctl 和 encode
命令来加密值
# <<"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...">>}
或者,在 Windows 上
# <<"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...">>}
使用 CLI 工具解密 advanced.config 值
使用 decode
命令来解密值
rabbitmqctl decode '{encrypted, <<"...">>}' mypassphrase
# => <<"guest">>
rabbitmqctl decode '{encrypted, <<"...">>}' mypassphrase
# => "amqp://fred:secret@host1.domain/my_vhost"
或者,在 Windows 上
rabbitmqctl decode "{encrypted, <<""..."">>}" mypassphrase
# => <<"guest">>
rabbitmqctl 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 工具
rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 10000 \
'<<"guest">>' mypassphrase
或者,在 Windows 上
rabbitmqctl 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
的文件来定义 broker 将使用的环境变量。 其 位置 可以使用 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 手册页。
Windows
自定义名称、端口或位置的最简单方法是在 Windows 对话框中配置环境变量:开始 > 设置 > 控制面板 > 系统 > 高级 > 环境变量。 然后创建或编辑系统变量名称和值。
或者,可以使用名为 rabbitmq-env-conf.bat
的文件来定义 broker 将使用的环境变量。 其 位置 可以使用 RABBITMQ_CONF_ENV_FILE
环境变量配置。
如果配置文件位置或 ``rabbitmq-env-conf.bat` 中的任何值发生更改,Windows 服务用户将需要**重新安装服务**。 否则,服务使用的环境变量将不会更新。
这可以使用安装程序或在具有管理员权限的命令行上完成
- 启动 管理命令提示符
- 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 | epmd 使用的接口,epmd 是节点间和 CLI 工具通信中的组件。 默认值:所有可用接口,包括 IPv6 和 IPv4。 |
ERL_EPMD_PORT | epmd 使用的端口,epmd 是节点间和 CLI 工具通信中的组件。 默认值: |
RABBITMQ_DISTRIBUTION_BUFFER_SIZE | 用于节点间通信连接的 传出数据缓冲区大小限制,以千字节为单位。 不建议使用低于 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 服务器时使用的 danger 设置此变量将替换 RabbitMQ 提供的默认值。 tip 考虑使用 默认:
|
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS | 调用 RabbitMQ 服务器时使用的 默认:
|
RABBITMQ_SERVER_START_ARGS | 调用 RabbitMQ 服务器时使用的 默认值:(无) |
RABBITMQ_DEFAULT_USER | 此环境变量**仅用于开发和 CI 环境**。 这与 默认值:(无) |
RABBITMQ_DEFAULT_PASS | 此环境变量**仅用于开发和 CI 环境**。 这与 默认值:(无) |
RABBITMQ_DEFAULT_VHOST | 此环境变量**仅用于开发和 CI 环境**。 这与 默认值:(无) |
除了上面列出的变量外,还有几个环境变量告诉 RabbitMQ 在哪里找到其数据库、日志文件、插件、配置等。
最后,某些环境变量是操作系统特定的。
名称 | 描述 |
---|---|
HOSTNAME | 当前机器的名称。 默认:
|
COMPUTERNAME | 当前机器的名称。 默认:
|
ERLANG_SERVICE_MANAGER_PATH | 此路径是 默认:
|
操作系统内核限制
大多数操作系统对内核资源强制执行限制:虚拟内存、堆栈大小、打开的文件句柄等等。 对于 Linux 用户,这些限制可以称为“ulimit 限制”。
RabbitMQ 节点最常受到最大打开文件句柄限制的影响。 大多数 Linux 发行版上的默认限制值通常为 1024,这对于消息代理(或通常,任何数据服务)来说都非常低。 有关建议值,请参见部署指南。
修改限制
使用 systemd(现代 Linux 发行版)
在使用 systemd 的发行版上,OS 限制通过 /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 进程的限制。