RabbitMQ系列(六)RabbitMQ的配置

12,164 阅读23分钟

概述

RabbitMQ自带默认的内置配置。这些配置在某些环境下(如开发或QA环境)是足够的。而对于其他情况以及生产部署调优,有一种方法可在RabbitMQ服务器和插件中配置很多的信息。

本指南覆盖许多关于配置的主题:
1)配置服务器和插件的各种设置的不同方式
2)配置文件:rabbitmq.conf主要配置文件和advanced.config可选配置文件
3)故障修复:如何验证配置文件路径以及有效配置
4)环境变量
5)操作系统(内核)限制
6)可用的核心配置
7)可用的环境变量
8)如何对敏感配置信息加密
更多...

配置机制

RabbitMQ可以通过用于负责不同方面的的配置机制进行配置。

配置机制 描述
配置文件 定义服务器和插件:
1)TCP监听器和其他网络相关设置;
2)TLS;
3)资源约束(告警);
4)后端认证与授权;
5)消息存储设置;
等等
环境变量 定义节点名称、文件和目录位置、脚本或rabbitmq-env.conf(Linux)、 rabbitmq-env-conf.bat(Windows)配置文件中的运行时标识。
rabbitmqctl工具 当使用内部的后端认证与授权,rabbitmqctl工具可用于管理虚拟主机、用户和权限
rabbitmq-plugin工具 用于管理插件的工具
参数和策略 定义可以在运行时更改的集群范围的设置,以及便于为队列分组(交换器等)配置的设置,如包含可选的队列参数。
运行时(Erlang VM)标识 控制系统的底层方面:内存分配设置、节点间通信缓冲区大小、运行时调度程序设置等。
操作系统内核限制 控制内核施加的进程限制:最大打开文件句柄限制、最大进程数和内核线程数、最大常驻集大小等等。

大部分设置通过前面两种方式进行配置。因此本指南主要说明这两种。

配置文件

介绍

虽然RabbitMQ中的一些设置可以使用环境变量进行调优,但大多数设置是使用配置文件配置的,通常名为rabbitmq.conf。这包括核心服务器的配置和插件。
下面将介绍语法、位置、如何配置、如何查找示例等等。 在RabbitMQ 3.7.0之前,RabbitMQ配置文件为rabbitmq.config并且使用Erlang术语配置格式。这种格式为了兼容还被支持。RabbitMQ 3.7.0及以后版本强烈建议使用新的配置格式。

文件位置

不同的操作系统和安装包类型,其默认的配置文件不同。 当您对操作系统的RabbitMQ配置文件位置和安装方法有疑问时,请参考日志文件或者管理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)

或者可以在管理UI中找到配置文件位置,以及关于节点的其他详细信息。

验证配置:如何检查有效配置

可以使用rabbitmqctl打印有效的配置(用户提供的值合并到默认值中)。它将打印出在节点上运行的每个应用程序(RabbitMQ、插件、库)的应用配置。
有效的配置应该与配置文件位置一起验证(如上所述)。这是解决一系列问题的有用步骤。

配置文件格式

在RabbitMQ 3.7.0之前,RabbitMQ配置文件为rabbitmq.config并且使用Erlang术语配置格式。这种格式为了兼容还被支持。RabbitMQ 3.7.0及以后版本强烈建议使用新的配置格式。
比较

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

[
  {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 3.7.0之前使用的经典配置格式相比,它也相对有限。例如,在配置LDAP支持时,可能需要使用深度嵌套的数据结构来表示所需的配置。为了满足这一需求,RabbitMQ仍然支持经典的RabbitMQ。配置文件以及同时使用两种格式的能力(advanced.config)。下面几节将更详细地讨论这个问题。

rabbitmq.conf

rabbitmq.conf配置文件允许配置RabbitMQ服务器和插件。从RabbitMQ 3.7.0开始,格式是sysctl格式。

语法可以简单解释为3点:
1)一行一个设置
2)行由Key = Value构成
3)注释以#开头

一个最小化的例子配置文件如下:

# 这是一个注释
listeners.tcp.default = 5673

相同示例的经典配置格式:

[
  {rabbit, [
            {tcp_listeners, [5673]}
           ]
  }
].

RabbitMQ服务器源存储库包含一个rabbitmq.conf的示例文件rabbitmq.conf.example。它包含您可能想要设置的大多数配置项的示例(有些非常模糊的项被省略了),以及这些设置的文档。诸如网络、TLS或访问控制等文档指南通常会提供这两种格式的示例。

注意,不要将此配置文件与环境变量配置文件rabbitmq-env.conf和rabbitmq-env-conf.bat混淆。

如果要覆盖RabbitMQ的主要配置文件路径,使用RABBITMQ_CONFIG_FILE环境变量进行指定(不包含.conf扩展名,会自动追加)。

advanced.config(经典格式)

有些配置设置是不可能或者很难通过sysctl格式进行配置。因此,可以使用Erlang术语配置格式的附加配置文件,该文件通常被命名为advanced.config。它将与rabbitmq.conf中提供的配置合并。
RabbitMQ服务器源存储库包含一个advanced.config的示例文件advanced.config.example。它关注的是通常使用高级配置设置的选项。 如果要覆盖advanced.config配置文件路径,使用RABBITMQ_ADVANCED_CONFIG_FILE环境变量进行指定。

注意:
1.整个配置是以“[].”包裹,且必须以.结束;
2.该配置文件的注释行是以“%%”开头;

rabbitmq.config (经典格式)

RabbitMQ 3.7.0及之后的版本还支持经典配置文件格式,配置文件名为:rabbitmq.config。经典格式已经过时了,请根据需要选择新的配置格式文件: advanced.config。
为了使用经典格式的配置文件,可通过RABBITMQ_CONFIG_FILE环境变量指向一个以.config扩展名的文件。这个扩展名表明RabbitMQ应该将该文件视为经典格式的配置文件。
RabbitMQ服务器源存储库包含一个rabbitmq.config的示例文件rabbitmq.config.example。它包含一个典型配置格式的大多数配置项的示例。
如果要覆盖RabbitMQ主要配置文件位置,请使用RABBITMQ_CONFIG_FILE环境变量。使用.config作为经典配置格式的文件扩展名。
一般情况下,使用advanced.config配置那些只能使用经典格式的配置项,使用rabbitmq.conf配置新的格式的配置项。

注意:
1.整个配置是以“[].”包裹,且必须以.结束;
2.该配置文件的注释行是以“%%”开头;

rabbitmq.conf和rabbitmq-env.conf的位置

这些文件的位置是特定于发行版的。在默认情况下,它们不会被创建。但是预期它们位于每个平台上的以下位置:
1)Generic UNIX: $RABBITMQ_HOME/etc/rabbitmq/
2)Debian: /etc/rabbitmq/
3)RPM: /etc/rabbitmq/
4)Windows: %APPDATA%\RabbitMQ
5)Mac OS (Homebrew): ${install_prefix}/etc/rabbitmq/
Homebrew:/usr/local

如果rabbitmq-env.conf不存在,可以手动在指定的位置(RABBITMQ_CONF_ENV_FILE环境变量指定)上创建。在Windows操作系统中,文件名为rabbitmq-env-conf.bat。
如果rabbitmq.conf不存在,可以手动在指定的位置(RABBITMQ_CONFIG_FILE环境变量指定)上创建,.conf扩展名将自动添加到RABBITMQ_CONFIG_FILE环境变量所指定的值后面。
在Linux系统中,在变更后重启RabbitMQ服务器;在Windows系统中,添加或删除配置文件后,用户需要重新安装RabbitMQ服务器。

rabbitmq.conf配置项(核心部分)

KEY 描述
listeners 监听AMQP 0-9-1和AMQP 1.0连接(非TLS)的端口。
默认值:listeners.tcp.default = 5672
num_acceptors.tcp 用于处理TCP连接(非TLS)的Erlang进程数。
默认值:num_acceptors.tcp = 10
handshake_timeout AMQP 0-9-1握手的超时时间,单位为毫秒。
默认值:handshake_timeout = 10000
listeners.ssl 监听AMQP 0-9-1和AMQP 1.0连接(TLS)的端口。
默认值:不设置
num_acceptors.ssl 用于处理客户端的TLS连接的Erlang进程数。
默认值:num_acceptors.ssl = 10
ssl_options TLS配置。
默认值:ssl_options = none
ssl_handshake_timeout SSL握手超时时间,单位毫秒。
默认值:ssl_handshake_timeout = 5000
vm_memory_high_watermark 触发流量控制的内存阈值。可以为绝对值或者相对操作系统的可用RAM。如:vm_memory_high_watermark.relative = 0.6 或者vm_memory_high_watermark.absolute = 2GB。
默认值:vm_memory_high_watermark.relative = 0.4
vm_memory_calculation_strategy 内存使用报告策略,可以为如下之一:
1)allocated: 使用Erlang内存分配器统计信息。
2)rss: 使用操作系统RSS内存报告。这将使用特定于os的方法,并可能启动短生命期的子进程。
3)legacy: 使用遗留内存报告(运行时使用了多少内存)。这种战略相当不准确。
4)erlang: 与遗留系统相同,保留了向后兼容性。
默认值:vm_memory_calculation_strategy = allocated
vm_memory_high_watermark_paging_ratio 当队列开始将消息分页到磁盘以释放内存时,高水印部分的占比。
默认值:vm_memory_high_watermark_paging_ratio = 0.5
total_memory_available_override_value 使覆盖可用内存总量成为可能,而不是使用特定于os的方法从环境中推断它。只有当节点实际可用的RAM最大容量与节点将推断出的值不匹配时,才应该使用这个值,例如,由于容器化或节点无法意识到的类似约束。该值可以设置为整数字节数,也可以设置为信息单位(如:8G)。例如,当该值被设置为4G时,节点将认为它在具有4G RAM的机器上运行。
默认值:不设置或者不使用
disk_free_limit RabbitMQ存储数据的分区的磁盘空闲空间限制。当可用磁盘空间低于此限制时,将触发流控制。可以将该值设置为相对于RAM总量的值,也可以设置为以字节为单位的绝对值,或者设置为以信息单元为单位的绝对值(如50M或者5G)。如:disk_free_limit.relative = 3.0 或者 disk_free_limit.absolute = 2GB。默认情况下,空闲磁盘空间必须超过50MB。
默认值:disk_free_limit.absolute = 50MB
log.file.level 控制日志记录的粒度。该值是日志事件类别和日志级别对的列表。日志级别有:error>warning>info>debug。
默认值:log.file.level = info
channel_max 允许客户端通信过程中的Channel最大数,不包含为0的特殊Channel。设置为0表示不限制,但这是一个危险值(应用程序会有Channel漏洞),使用更多Channel将增加消息代理的内存占用。
默认值:channel_max = 2047
channel_operation_timeout Channel通信的超时时间,单位毫秒。用于内部通信,由于消息传递协议的差异和限制,没有直接向客户端公开。
默认值:channel_operation_timeout = 15000
max_message_size 允许的最大消息有效负载,单位为字节。
默认值:134217728 最大值为:536870912
heartbeat 表示连接参数协商期间服务器建议的心跳超时的值。如果在两端都设置为0,则禁用心跳(不建议这样做)。
默认值:heartbeat = 60
default_vhost 当RabbitMQ从头创建一个新数据库时创建的虚拟主机。“amq.rabbitmq.log”交换机存在该虚拟主机中。
默认值:default_vhost = /
default_user RabbitMQ从零开始创建新数据库时要创建的用户名。
默认值:default_user = guest
default_pass 默认用户的密码。
默认值:default_pass = guest
default_user_tags 默认用户的标签。
默认值:default_user_tags.administrator = true
default_permissions 创建默认用户时的权限。
默认值:default_permissions.configure = .* default_permissions.read = .* default_permissions.write = .*
loopback_users 只允许通过环回地址(localhost)连接到代理的用户列表。要允许默认的“guest”用户远程连接(不适合在生产环境中使用)。所以生产环境应将此设置为“none”:loopback_users = none。要将另一个用户限制为仅本地主机连接,请这样做(“monitoring”是用户的名称):loopback_users.monitoring = true。
默认值:loopback_users.guest = true
cluster_formation.classic_config.nodes 典型的后端通信节点列表的端点发现。例如,和集群中`rabbit@hostname1`和`rabbit@hostname2`的通信:cluster_formation.classic_config.nodes.1 = rabbit@hostname1 cluster_formation.classic_config.nodes.2 = rabbit@hostname2。
默认值:不设置
collect_statistics 收集统计模式。主要与管理插件相关。选项包括:
1)none:不发出统计信息事件;
2)coarse:发出每个队列/每个通道/每个连接的统计信息;
3)fine: 还发出每个消息的统计信息。
默认值:collect_statistics = none
collect_statistics_interval 统计数据收集间隔(毫秒)。主要与管理插件相关。
默认值:collect_statistics_interval = 5000
management_db_cache_multiplier 影响管理插件缓存昂贵的管理查询(如队列列表)的时间。缓存将把最后一个查询的运行时间乘以这个值,并将结果缓存这段时间。
默认值:management_db_cache_multiplier = 5
auth_mechanisms 提供给客户端的SASL认证机制。
默认值:auth_mechanisms.1 = PLAIN auth_mechanisms.2 = AMQPLAIN
auth_backends 要使用的后端认证和授权列表。除了rabbit_auth_backend_internal数据库外可以通过插件访问。
默认值:auth_backends.1 = internal
reverse_dns_lookups RabbitMQ是否对客户端连接执行反向DNS查询,并通过rabbitmqctl工具和管理插件显示该信息。
默认值:reverse_dns_lookups = false
delegate_count 用于集群内部通信的委托进程数量。在具有大量内核并且也是集群的一部分的机器上,您可能希望增加这个值
默认值:delegate_count = 16
tcp_listen_options 默认的套接字选项。你可能不想改变这个。
默认值:tcp_listen_options.backlog = 128 tcp_listen_options.nodelay = true tcp_listen_options.linger.on = true tcp_listen_options.linger.timeout = 0 tcp_listen_options.exit_on_close = false
hipe_compile 不再支持此选项。从Erlang 22开始支持HiPE。
默认值:hipe_compile = false
cluster_partition_handling 如何处理网络分区。可用的模式是:
1)ignore;
2)autoheal;
3)pause_minority;
4)pause_if_all_down:模式需要额外的参数:nodes和recover。
默认值:cluster_partition_handling = ignore
cluster_keepalive_interval 节点向其他节点发送keepalive消息的频率(以毫秒为单位)。注意,这与net_ticktime不同;错过的keepalive消息不会导致节点被认为是关闭的。
默认值:cluster_keepalive_interval = 10000
queue_index_embed_msgs_below 消息大小,单位为字节,下面的消息将直接嵌入到队列索引中。建议您在更改之前阅读persister优化文档。
默认值:queue_index_embed_msgs_below = 4096
mnesia_table_loading_retry_timeout 等待集群中的Mnesia表可用时使用的超时。
默认值:mnesia_table_loading_retry_timeout = 30000
mnesia_table_loading_retry_limit 在集群启动中等待Mnesia表时重试。注意,此设置不应用于Mnesia升级或节点删除
默认值:mnesia_table_loading_retry_limit = 10
mirroring_sync_batch_size 批处理大小,用于将消息传输到未同步的副本(队列镜像)。
默认值:mirroring_sync_batch_size = 4096
queue_master_locator 队列主要位置策略。可用的策略是:
1)min-masters;
2)client-local;
3)random。
默认值:queue_master_locator = client-local
proxy_protocol 如果设置为true, RabbitMQ将期望在AMQP连接打开时首先发送代理协议头。这意味着在RabbitMQ前设置一个符合代理协议的反向代理(例如HAproxy或AWS ELB)。当启用代理协议时,客户端不能直接连接到RabbitMQ,因此所有连接都必须通过反向代理。
默认值:proxy_protocol = false

advanced.config配置项(高级部分)

以下配置设置只在advanced config配置文件中。

KEY 描述
msg_store_index_module 队列索引的实现模块。
默认值:{rabbit, [{msg_store_index_module, rabbit_msg_store_ets_index}]}
backing_queue_module 队列内容的实现模块。
默认值:{rabbit, [{backing_queue_module, rabbit_variable_queue}]}
msg_store_file_size_limit 消息存储段文件大小。将此更改为具有现有(初始化)数据库的节点是危险的,可能导致数据丢失!
默认值:{rabbit, [{msg_store_file_size_limit, 16777216}]}
trace_vhosts 由内部跟踪器使用。
默认值:{rabbit, [{trace_vhosts, []}]}
msg_store_credit_disc_bound 消息存储给出的队列进程的Credit。默认情况下,队列进程将获得4000个消息存储Credit,然后每处理800条消息就获得800个Credit。由于内存压力而需要调出的消息也将使用此Credit。此值仅在将消息持久化到消息存储时生效。如果消息嵌入到队列索引中,则修改此设置没有效果,因为在写入队列索引时不使用credit_flow。
默认值:{rabbit, [{msg_store_credit_disc_bound, {4000, 800}}]}
queue_index_max_journal_entries 在多少个队列索引日志条目之后,它将被刷新到磁盘。
默认值:{rabbit, [{queue_index_max_journal_entries, 32768}]}
lazy_queue_explicit_gc_run_operation_threshold 仅对处于内存压力下的延迟队列使用可调值。这是触发垃圾收集器和其他内存减少活动的阈值。低值会降低性能,而高值可以提高性能,但会导致更高的内存消耗。你几乎肯定不应该改变这一点。
默认值:{rabbit, [{lazy_queue_explicit_gc_run_operation_threshold, 1000}]}
queue_explicit_gc_run_operation_threshold 只有在内存压力下,正常队列才具有可调值。这是触发垃圾收集器和其他内存减少活动的阈值。低值会降低性能,而高值可以提高性能,但会导致更高的内存消耗。你几乎肯定不应该改变这一点。
默认值:{rabbit, [{queue_explicit_gc_run_operation_threshold, 1000}]}

插件部分

RabbitMQ附带的几个插件都有专门的文档指南来介绍插件配置: 1)rabbitmq_management:www.rabbitmq.com/management.… 2)rabbitmq_management_agent:www.rabbitmq.com/management.… 3)rabbitmq_stomp:www.rabbitmq.com/stomp.html 4)rabbitmq_mqtt:www.rabbitmq.com/mqtt.html 5)rabbitmq_shovel:www.rabbitmq.com/shovel.html 6)rabbitmq_federation:www.rabbitmq.com/federation.… 7)rabbitmq_auth_backend_ldap:www.rabbitmq.com/ldap.html

配置值加密

敏感的配置项(例如密码、包含凭证的URL)可以在RabbitMQ配置文件中加密。RabbitMQ服务在启动时解密加密条目。

注意,加密的配置条目并不能使系统更安全。不过,它们允许RabbitMQ的部署符合各国的规定,即配置文件中不应出现纯文本形式的敏感数据。

加密的值必须在Erlang加密的{encryption,…}元组中。下面是一个配置文件的例子,默认用户的密码是加密的:

[
  {rabbit, [
      {default_user, <<"guest">>},
      {default_pass,
        {encrypted,
         <<"cPAymwqmMnbPXXRVqVzpxJdrS8mHEKuo2V+3vt1u/fymexD9oztQ2G/oJ4PAaSb2c5N/hRJ2aqP/X0VAfx8xOQ==">>
        }
      },
      {config_entry_decoder, [
             {passphrase, <<"mypassphrase">>}
         ]}
    ]}
].

注意:config_entry_decoder中的“passphrase”是将用于解密密文的密钥。

密码不需要硬编码在配置文件,它可以在一个单独的文件:

[
  {rabbit, [
      ...
      {config_entry_decoder, [
             {passphrase, {file, "/path/to/passphrase/file"}}
         ]}
    ]}
].

RabbitMQ还可以使用{passphrase, prompt}请求操作符在启动时输入密码。 使用rabbitmqctl和encode命令对值进行加密:

rabbitmqctl encode '<<"guest">>' mypassphrase
{encrypted,<<"... long encrypted value...">>}
rabbitmqctl encode '"amqp://fred:secret@host1.domain/my_vhost"' mypassphrase
{encrypted,<<"... long encrypted value...">>}

在Windows系统中:

rabbitmqctl encode "<<""guest"">>" mypassphrase
{encrypted,<<"... long encrypted value...">>}
rabbitmqctl encode '"amqp://fred:secret@host1.domain/my_vhost"' mypassphrase
{encrypted,<<"... long encrypted value...">>}

添加解码命令,如果你想解密的值:

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

或者,在Window系统中:

rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 10000 "<<""guest"">>" mypassphrase

环境变量

某些服务器参数可以通过环境变量进行配置:节点名称、RabbitMQ配置文件位置、节点间通信端口、Erlang VM端口等等。

路径和目录名称限制

一些环境变量配置路径和位置(节点的基本或数据目录、插件源和扩展目录,等等)。这些路径必须排除一些字符:
1)* 和 ? (Linux, MacOS, BSD系统)
2)^ 和 ! (Windows系统)
3)[ 和 ]
4){ 和 }
上述字符将使节点无法启动或按预期运行(例如,展开插件并加载它们的元数据)。

Linux, MacOS, BSD

可以使用一个名为rabbitmq-env.conf的文件来定义将使用的环境变量(不带RABBITMQ_前缀的标准环境变量名)。它的位置可以使用RABBITMQ_CONF_ENV_FILE环境变量进行配置。
例如,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

Windows

可以使用一个名为rabbitmq-env-conf.bat的文件来定义代理将使用的环境变量。它的位置可以使用RABBITMQ_CONF_ENV_FILE环境变量进行配置。
自定义名称、端口或位置的最简单选项是在Windows对话框中配置环境变量:启动>设置>控制面板>系统>高级>环境变量。然后创建或编辑系统变量名和值。
注意:要使环境更改在Windows上生效,必须重新安装服务。重启服务是不够的。这可以使用安装程序或在命令行与管理员权限:

1)启动管理命令提示符
2)cd到sbin RabbitMQ服务器安装目录下的文件夹(比如C:\Program Files (x86)\RabbitMQ服务器\rabbitmq_server-3.8.2\sbin)
3)运行rabbitmq-service.bat remove
4)通过命令行设置环境变量,即运行如下命令:
set RABBITMQ_BASE=C:\Data\RabbitMQ
Run rabbitmq-service.bat install

或者如果新的配置需要在下一次代理重启后生效,可以跳过服务删除步骤:

1)启动管理命令提示符
2)将cd放入RabbitMQ服务器安装目录下的sbin文件夹
3)通过命令行设置环境变量
4)运行rabbitmq-service.bat安装,它将只更新服务参数

RabbitMQ环境变量

RabbitMQ使用的所有环境变量都使用前缀RABBITMQ_(在rabbitmq-env.conf或rabbitmqenv-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工具通信的端口。如果节点在配置文件设置配置了kernel.inet_dist_listen_min或kernel.inet_dist_listen_max Key,将忽略此项配置。
默认值:RABBITMQ_NODE_PORT + 20000
RABBITMQ_NODENAME 每个Erlang节点和机器的组合的节点名应该是唯一的。要运行多个节点,请参阅集群指南
默认值:Unix*: rabbit@$HOSTNAME Windows: rabbit@%COMPUTERNAME%
RABBITMQ_CONFIG_FILE RabbitMQ主要配置文件的位置,不包含.conf扩展名(或者.config)。例如:/data/rabbitmq/rabbitmq。
默认值:Generic UNIX: $RABBITMQ_HOME/etc/rabbitmq/rabbitmq Debian: /etc/rabbitmq/rabbitmq RPM: /etc/rabbitmq/rabbitmq MacOS(Homebrew): \$\{install_prefix\}/etc/rabbitmq/rabbitmq, Homebrew:/usr/local Windows: %APPDATA%\RabbitMQ\rabbitmq
RABBITMQ_ADVANCED_CONFIG_FILE RabbitMQ的advanced.config文件的位置,不包含.config扩展名。例如:/data/rabbitmq/advanced。
默认值:Generic UNIX: $RABBITMQ_HOME/etc/rabbitmq/advanced Debian: /etc/rabbitmq/advanced RPM:/etc/rabbitmq/advanced MacOS (Homebrew):\$\{install_prefix\}/etc/rabbitmq/advanced, Homebrew:/usr/local Windows: %APPDATA%\RabbitMQ\advanced
RABBITMQ_CONF_ENV_FILE 包含环境变量(不包含 RABBITMQ_前缀)的定义的文件位置。
默认值:Generic UNIX package: $RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf Ubuntu and Debian: /etc/rabbitmq/rabbitmq-env.conf RPM: /etc/rabbitmq/rabbitmq-env.conf MacOS (Homebrew): \$\{install_prefix\}/etc/rabbitmq/rabbitmq-env.conf, Homebrew:/usr/local Windows: %APPDATA%\RabbitMQ\rabbitmq-env-conf.bat
RABBITMQ_MNESIA_BASE 这个基本目录包含RabbitMQ服务器节点数据库、消息存储和集群状态文件的子目录,每个节点一个,除非RABBITMQ_MNESIA_DIR被显式设置。重要的是,有效的RabbitMQ用户在任何时候都有足够的权限来读写和创建这个目录中的文件和子目录。此变量通常不被覆盖。通常会覆盖RABBITMQ_MNESIA_DIR。
默认值:Generic UNIX package: $RABBITMQ_HOME/var/lib/rabbitmq/mnesia Ubuntu and Debian packages: /var/lib/rabbitmq/mnesia/ RPM: /var/lib/rabbitmq/plugins MacOS (Homebrew): \$\{install_prefix\}/var/lib/rabbitmq/mnesia, Homebrew:/usr/local Windows: %APPDATA%\RabbitMQ
RABBITMQ_MNESIA_DIR 存储RabbitMQ节点数据的目录。这是一个模式数据库、消息存储、集群成员信息和其他持久节点状态。
默认值:Generic UNIX package: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME Ubuntu and Debian packages: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME RPM: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME MacOS (Homebrew): \$\{install_prefix\}/var/lib/rabbitmq/mnesia/$RABBITMQ_NODENAME, /usr/local Windows: %APPDATA%\RabbitMQ\$RABBITMQ_NODENAME
RABBITMQ_PLUGINS_DIR 插件存档文件所在的目录列表并从中提取。这是类路径变量,不同的路径由特定于操作系统的分隔符(Unix为:,Windows为;)。插件可以安装到这里列出的任何目录。不能包含路径限制部分中提到的任何字符。
默认值:Generic UNIX package: $RABBITMQ_HOME/plugins Ubuntu and Debian packages: /var/lib/rabbitmq/plugins RPM: /var/lib/rabbitmq/plugins MacOS (Homebrew): \$\{install_prefix\}/Cellar/rabbitmq/${version}/plugins, Homebrew:/usr/local Windows: %RABBITMQ_HOME%\plugins
RABBITMQ_PLUGINS_EXPAND_DIR 节点展开(解压)插件的目录并将其用作代码路径位置。不能包含路径限制部分中提到的任何字符。
默认值:Generic UNIX package: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME-plugins-expand Ubuntu and Debian: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME-plugins-expand RPM: $RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME-plugins-expand MacOS (Homebrew): \$\{install_prefix\}/var/lib/rabbitmq/mnesia/$RABBITMQ_NODENAME-plugins-expand Windows:%APPDATA%\RabbitMQ\$RABBITMQ_NODENAME-plugins-expand
ERL_EPMD_ADDRESS epmd使用的网络接口,是节点间和CLI工具通信的组件。
默认值:所有可用的接口,包括IPv6和IPv4
ERL_EPMD_PORT epmd使用的端口,节点间和CLI工具通信中的一个组件。
默认值:4369
RABBITMQ_DISTRIBUTION_BUFFER_SIZE 输出数据缓冲区大小限制用于节点间通信连接,单位为千字节。不推荐小于64 MB的值。
默认值:128000
RABBITMQ_IO_THREAD_POOL_SIZE 运行时用于I/O的线程数。不推荐小于32的值。
默认值:128 (Linux), 64 (Windows)
RABBITMQ_USE_LONGNAME 当设置为true时,这将导致RabbitMQ使用完全限定的名称来标识节点。这在使用完全限定域名的环境中可能很有用。注意,如果不重置节点,就不可能在使用短名称和长名称之间进行切换。
默认值:false
RABBITMQ_SERVICENAME 已安装的Windows服务的名称。这将出现在services.msc中。
默认值:RabbitMQ
RABBITMQ_CONSOLE_LOG 将此变量设置为new或再利用,以便将控制台输出从服务器重定向到默认RABBITMQ_BASE目录中名为%RABBITMQ_SERVICENAME%的文件。如果没有设置,来自服务器的控制台输出将被丢弃(默认)。 new:每次服务启动时都会创建一个新文件; reuse:每次服务启动时都会覆盖该文件。
默认值:不设置
RABBITMQ_SERVER_CODE_PATH 启动运行时要指定的额外代码路径(目录)。将在节点启动时传递给ERL命令。
默认值:不设置
RABBITMQ_CTL_ERL_ARGS 调用rabbitmqctl时使用的ERL命令的参数。这可以设置为指定Erlang分发使用的端口范围:-kernel inet_dist_listen_min 35672、-kernel inet_dist_listen_max 35680。
默认值:不设置
RABBITMQ_SERVER_ERL_ARGS 调用RabbitMQ服务器时使用的ERL命令的标准参数。仅出于调试的目的,应该覆盖此内容。覆盖此变量将替换默认值。
默认值:Unix*: +P 1048576 +t 5000000 +stbt db +zdbbl 128000 Windows: None
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 调用RabbitMQ服务器时使用的erl命令的附加参数。这个变量的值被附加到默认的参数列表中(RABBITMQ_SERVER_ERL_ARGS)。
默认值:Unix*: None Windows: None
RABBITMQ_SERVER_START_ARGS 调用RabbitMQ服务器时使用的erl命令的额外参数。这不会覆盖RABBITMQ_SERVER_ERL_ARGS。
默认值:不设置

除了上面列出的变量外,还有几个环境变量告诉RabbitMQ在哪里找到它的数据库、日志文件、插件、配置等等。最后,一些环境变量是特定于操作系统的。

名称 描述
HOSTNAME 当前机器的名称。
默认值:Unix, Linux: env hostname MacOS: env hostname -s
COMPUTERNAME 当前机器的名称。
默认值:Windows: localhost
ERLANG_SERVICE_MANAGER_PATH 此路径是erlsrv.exe的位置。Erlang服务包装器脚本。默认值:Windows Service: %ERLANG_HOME%\erts-x.x.x\bin

操作系统内核限制

大多数操作系统都对内核资源施加限制:虚拟内存、堆栈大小、打开的文件句柄等等。对于Linux用户来说,这些限制可以称为“ulimit limits”。 RabbitMQ节点最常受到最大打开文件句柄限制的影响。大多数Linux发行版的缺省限值通常是1024,对于消息传递代理(通常是任何数据服务)来说,这个值非常低。有关推荐值,请参阅生产检查表。

修改限制

使用systemd(基于Linux发行版本)

在使用systemd的发行版上,操作系统限制通过/etc/systemd/system/rabbitmq-server.service.d/limits.conf上的配置文件进行控制。例如,将最大打开文件句柄限制(nofile)设置为64000:

[Service]
LimitNOFILE=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进程的限制不能更改。

使用Docker

要配置Docker包含的内核限制,请使用Docker守护进程配置文件中的“default-ulimits”键。文件必须安装在Docker主机/etc/docker/daemon.json:

{
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  }
}

上一篇:RabbitMQ系列(五)RabbitMQ的文件和目录位置
下一篇:RabbitMQ系列(七)RabbitMQ的参数与策略