在 nix 系统上配置 RabbitMQ

配置你的环境

RabbitMQ 在/etc/rabbitmq/rabbitmq-env.conf 中查找一组环境变量。如果它不存在,则它采用默认值。rabbitmq-env.conf 中的所有值都被导出到 RabbitMQ 服务器运行的环境中,并带有 RABBITMQ_ 前缀; 此前缀不包含在配置文件中。可以设置以下变量(使用 key=value 语法):

NODENAME:设置 RabbitMQ 节点的名称。

CONFIG_FILE:设置 RabbitMQ 配置文件的位置(不是这个环境文件)

NODE_IP_ADDRESS:设置要监听的特定 IP 地址。

NODE_PORT:设置要侦听的端口

DIST_PORT:设置侦听群集的端口

USE_LONGNAME:布尔值,指示是否使用完全限定名称来标识节点。在具有相同短名称的环境中很有用。

CTL_ERL_ARGS:设置运行 rabbitmqctl 时调用的 erl 命令的参数。用于调试。

SERVER_ERL_ARGS:设置启动 RabbitMQ 时调用的 erl 命令的参数。设置此值将覆盖默认值(请参阅下面的示例配置)。

SERVER_ADDITIONAL_ERL_ARGS:为启动 RabbitMQ 时调用的 erl 命令设置其他参数。设置此值会附加到 SERVER_ERL_ARGS 变量,默认情况下为空。

SERVER_START_ARGS:也为启动 RabbitMQ 时调用的 erl 命令设置。

示例配置文件(所有值实际上都是默认值):

NODENAME=rabbit@localhost    
CONFIG_FILE=/etc/rabbitmq/rabbitmq.config
NODE_IP_ADDRESS=""
NODE_PORT=5672
DIST_PORT=25672
USE_LONGNAME=false
CTL_ERL_ARGS=""
SERVER_ERL_ARGS="+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true}]"
SERVER_ADDITIONAL_ERL_ARGS=""
SERVER_START_ARGS=""

配置 RabbitMQ

注意:RabbitMQ 的配置文件采用标准的 Erlang 配置语法。如果你不熟悉 Erlang,一开始可能会让人感到困惑。它遵循以下格式:

[
    {rabbit,
        [
            {config_value_1, []},
            {config_value_2, []}
        ]
    },
    {additional_rabbitmq_plugins,
        [...]
    }
]

RabbitMQ 的配置部分有以下密钥(来自 https://www.rabbitmq.com/configure.html ):

  • tcp_listeners:侦听 AMQP 连接的端口列表(不含 SSL)。可以包含整数(意思是在所有接口上监听)或者诸如 {"127.0.0.1", 5672} 之类的元组来监听一个或多个接口。

    默认值:[5672]

  • num_tcp_acceptors:将接受 TCP 侦听器连接的 Erlang 进程数。

    默认值:10

  • handshake_timeout:AMQP 0-8 / 0-9 / 0-9-1 握手的最大时间(套接字连接和 SSL 握手后),以毫秒为单位。

    默认值:10000

  • ssl_listeners:如上所述,用于 SSL 连接。

    默认值:[]

  • num_ssl_acceptors:将接受 SSL 侦听器连接的 Erlang 进程数。

    默认值:1

  • ssl_options:SSL 配置。

    默认值:[]

  • ssl_handshake_timeout:SSL 握手超时,以毫秒为单位。

    默认值:5000

  • vm_memory_high_watermark:触发流量控制的内存阈值。请参阅基于内存的流量控制文档。

    默认值:0.4

  • vm_memory_high_watermark_paging_ratio:队列开始将消息分页到磁盘以释放内存的高水位限制的分数。请参阅基于内存的流量控制文档。

    默认值:0.5

  • disk_free_limit:RabbitMQ 存储数据的分区的磁盘可用空间限制。当可用磁盘空间低于此限制时,将触发流量控制。可以相对于 RAM 的总量设置该值(例如,{mem_relative, 1.0})。该值也可以设置为整数个字节。或者,或者,在信息单元中(例如 50MB)。默认情况下,可用磁盘空间必须超过 50MB。请参阅磁盘警报文档。

    默认值:50000000

  • log_levels:控制日志记录的粒度。该值是日志事件类别和日志级别对的列表。

    级别可以是 none(未记录任何事件),error(仅记录错误),warning(仅记录错误和警告),info(记录错误,警告和信息性消息)或 debug(错误,警告) ,记录信息性消息和调试消息)。

    目前定义了四个类别。其他当前未分类的事件始终记录在案。

    类别是:

    • channel - 适用于与 AMQP 频道相关的所有活动

    • connection - 用于与网络连接相关的所有事件

    • federation - 适用于与联邦有关的所有活动

    • mirroring - 用于与镜像队列相关的所有事件

    默认值:[{connection, info}]

  • frame_max:与客户端协商的帧的最大允许大小(以字节为单位)。设置为 0 表示无限制,但会在某些 QPid 客户端中触发错误。设置较大的值可以提高吞吐量; 设置较小的值可以改善延迟。

    默认值:131072

  • channel_max:与客户协商的最大允许通道数。设置为 0 表示无限制。使用更多通道会增加代理的内存占用量。

    默认值:0

  • channel_operation_timeout:通道操作超时(以毫秒为单位)(内部使用,由于消息传递协议的差异和限制而未直接暴露给客户端)。

    默认值:15000

  • heartbeat:表示服务器在 connection.tune 帧中发送的心跳延迟(以秒为单位)的值。如果设置为 0,则禁用心跳。客户端可能不遵循服务器建议,请参阅 AMQP 参考以获取更多详细信息。禁用心跳可能会在具有大量连接的情况下提高性能,但可能会导致在存在关闭非活动连接的网络设备时连接中断。

    默认值:60(版本 3.5.5 之前的 580

  • default_vhost:RabbitMQ 从头开始创建新数据库时创建的虚拟主机。交换 amq.rabbitmq.log 将存在于此虚拟主机中。

    默认值:<<"/">>

  • default_user:RabbitMQ 从头开始创建新数据库时要创建的用户名。

    默认值:<<"guest">>

  • default_pass:默认用户的密码。

    默认值:<<"guest">>

  • default_user_tags:默认用户的标签。

    默认值:[administrator]

  • default_permissions:创建默认用户时分配的权限。

    默认值:[<<".*">>, <<".*">>, <<".*">>]

  • loopback_users:仅允许通过环回接口(即 localhost)连接到代理的用户列表。

    如果你希望允许默认来宾用户远程连接,你需要将其更改为 []

    默认值:[<<"guest">>]

  • cluster_nodes:设置此项以使节点在第一次启动时自动发生。元组的第一个元素是节点将尝试聚类到的节点。第二个元素是 disc 或 ram,并确定节点类型。

    默认值:{[], disc}

  • server_properties:在连接时向客户通告的键值对列表。

    默认值:[]

  • collect_statistics:统计收集模式。主要与管理插件相关。选项包括:

    • none(不发布统计事件)

    • coarse(按队列/每个通道/每个连接发出的统计信息)

    • fine(也发出每条消息统计信息)

    你可能不想自己改变它。

    默认值:none

  • collect_statistics_interval:统计信息收集间隔,以毫秒为单位。主要与管理插件相关。

    默认值:5000

  • auth_mechanisms:为客户提供的 SASL 身份验证机制。

    默认值:['PLAIN', 'AMQPLAIN']

  • auth_backends:要使用的身份验证/授权后端列表。此列表可以包含模块的名称(在这种情况下,同一模块用于身份验证和授权),或者像 {ModN, ModZ} 这样的 2 元组,在这种情况下,ModN 用于身份验证,ModZ 用于授权。

    在 2 元组的情况下,ModZ 可以被列表替换,其中所有元素必须确认每个授权查询,例如 {ModN, [ModZ1, ModZ2]}。这允许授权插件混入并提供额外的安全约束。

    除了 rabbit_auth_backend_internal 之外的其他数据库可以通过插件获得。

    默认值:[rabbit_auth_backend_internal]

  • reverse_dns_lookups:设置为 true 以让 RabbitMQ 在客户端连接上执行反向 DNS 查找,并通过 rabbitmqctl 和管理插件显示该信息。

    默认值:false

  • delegate_count:用于群集内通信的委托进程数。在具有大量内核且也是群集的一部分的计算机上,你可能希望增加此值。

    默认值:16

  • trace_vhosts:由跟踪器内部使用。你不应该改变这个。

    默认值:[]

  • tcp_listen_options:默认套接字选项。你可能不想改变它。

    默认:

    [{backlog,       128},
     {nodelay,       true},
     {exit_on_close, false}]
    
  • hipe_compile:设置为 true 以使用 HiPE 预编译 RabbitMQ 的部分,HiPE 是 Erlang 的即时编译器。这将以增加启动时间为代价来增加服务器吞吐量。

    你可能会在启动时延迟几分钟后看到 20-50%的性能提升。这些数字与工作负载和硬件有很大关系。

    HiPE 支持可能无法编译到你的 Erlang 安装中。如果不是,启用此选项只会显示警告消息,启动将正常进行。例如,Debian / Ubuntu 用户需要安装 erlang-base-hipe 软件包。

    HiPE 在某些平台上根本不可用,特别是包括 Windows。

    HiPE 在 17.5 之前的 Erlang / OTP 版本中已知问题。对于 HiPE,强烈建议使用最新的 Erlang / OTP 版本。

    默认值:false

  • cluster_partition_handling:如何处理网络分区。可用的模式是:

    • ignore
    • pause_minority
    • {pause_if_all_down, [nodes], ignore | autoheal} 其中 [nodes] 是节点名称列表(例如:['rabbit@node1', 'rabbit@node2']
    • autoheal

    有关更多信息,请参阅有关分区的文档。

    默认值:ignore

  • cluster_keepalive_interval:节点应该多长时间向其他节点发送 keepalive 消息(以毫秒为单位)。请注意,这与 net_ticktime 不同; 错过的 keepalive 消息不会导致节点被视为关闭。

    默认值:10000

  • queue_index_embed_msgs_below:消息的字节大小,低于该大小,消息将直接嵌入队列索引中。建议你在更改之前阅读 persister 调整文档。

    默认值:4096

  • msg_store_index_module:队列索引的实现模块。建议你在更改之前阅读 persister 调整文档。

    默认值:rabbit_msg_store_ets_index

  • backing_queue_module:队列内容的实现模块。你可能不想改变它。

    默认值:rabbit_variable_queue

  • msg_store_file_size_limit:持久性的可调参数值。你几乎肯定不应该改变这一点。

    默认值:16777216

  • mnesia_table_loading_timeout:等待群集中的 Mnesia 表可用时使用的超时。

    默认值:30000

  • queue_index_max_journal_entries:持久性的可调值。你几乎肯定不应该改变这一点。

    默认值:65536

  • queue_master_locator:队列主位置策略。可用的策略是:

    • <<"min-masters">>

    • <<"client-local">>

    • <<"random">>

    有关更多信息,请参阅有关队列主位置的文档。

    默认值:<<"client-local">>