第6章 RabbitMQ配置
一般情况下,可以使用默认的内建配置来有效地运行RabbitMQ,并且大多数情况下也并不需要修改任何RabbitMQ的配置。当然,为了更加有效地操控RabbitMQ,也可以利用调节系统范围内的参数来达到定制化的需求。
RabbitMQ提供了三种方式来定制化服务:
(1)环境变量(Enviroment Variables)。RabbitMQ服务端参数可以通过环境变量进行配置,例如,节点名称、RabbitMQ配置文件的地址、节点内部通信端口等。
(2)配置文件(Configuration File)。可以定义RabbitMQ服务和插件设置,例如,TCP监听端口,以及其他网络相关的设置、内存限制、磁盘限制等。
(3)运行时参数和策略(Runtime Parameters and Policies)。可以在运行时定义集群层面的服务设置。
6.1 环境变量
RabbitMQ的环境变量都是以“RABBITMQ_”开头的,可以在Shell环境中设置,也可以在rabbitmq-env.conf这个RabbitMQ环境变量的定义文件中设置。如果是在非Shell环境中配置,则需要将“RABBITMQ_”这个前缀去除。优先级顺序按照Shell环境优先,其次rabbitmq-env.conf配置文件,最后时默认的配置。
当采用rabbitmq-server -detached启动RabbitMQ服务的时候,此服务节点默认以“rabbit@”加上当前Shell环境的hostname(主机名)来命名,即rabbit@$HOSTNAME。
如果需要定制节点的名称,而不是采用默认的方式,可以在rabbitmq-server命令前添加RABBITMQ_NODENAME变量来设定指定的名称。如下所示,此时创建的节点名称为“RabbitMQ-node1@RabbitMQ-node2”而非“rabbit@RabbitMQ-node2”。
RABBITMQ_NODENAME=RabbitMQ-node1 rabbitmq-server -detached
注意要点
如果先执行RABBITMQ_NODENAME=RabbitMQ-node1,再执行rabbitmq-server -detached命令,相当于只执行rabbitmq-server -detached命令,即对RABBITMQ_NODENAME的定义无效。
以RABBITMQ_NODENAME这个变量为例,RabbitMQ在启动服务的时候首先判断当前Shell环境中有无RABBITMQ_NOENAME的定义,如果有则启用此值;如果没有,则查看rabbitmq-env.conf中是否定义了NODENAME这个变量,如果有则启用此值,如果没有则采用默认的取值规则,即rabbit@$HOSTNAME。
下面演示如何配置rabbitmq-env.conf这个文件(默认在$RABBITMQ_HOME/etc/rabbitmq/目录下,可以通过在启动RabbitMQ服务时指定RABBITMQ_CONF_ENV_FILE变量来设置此文件的路径。默认rabbitmq-env.conf文件不存在,需要手动生成。):
# RabbitMQ 环境变量的定义文件
# 定义节点名称
NODENAME=rabbit-node1
# 定义RabbitMQ 的对外通信端口号
NODE_PORT=5672
# 定义RabbitMQ配置文件的目录,注意对于rabbitmq.config文件来说这里不用加“.config后缀”
CONFIG_FILE=/opt/rabbitmq/etc/rabbitmq/rabbitmq
对于默认的取值规则,这个在$RABBITMQ_HOME/usr/lib/rabbitmq/bin/rabbitmq-defaults文件中有相关设置,当然也可以通过修改这个文件中的内容来修改RabbitMQ的环境变量,但是并不推荐这么做,还是建议读者在rabbitmq-env.conf中进行相应的设置。rabbitmq-defaults 文件中的内容如代码清单6-1所示。
############################## 代码清单6-1
#!/bin/sh -e
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (the "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of the License
## at https://www.mozilla.org/MPL/
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
## Copyright (c) 2012-2021 VMware, Inc. or its affiliates. All rights reserved.
##
### next line potentially updated in package install steps
SYS_PREFIX=
CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl
BOOT_MODULE="rabbit"
if test -z "$CONF_ENV_FILE" && test -z "$RABBITMQ_CONF_ENV_FILE"; then
CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
fi
~
表6-1中梳理一些常见的RabbitMQ变量,这里包括但不仅限于这些变量。
变量名称 | 描述 |
---|---|
RABBITMQ_NODE_IP_ADDRESS | |
RABBITMQ_NODE_PORT | |
RABBITMQ_DIST_PORT | |
RABBITMQ_NODENAME | RabbitMQ的节点名称,默认为rabbit@$HOSTNAME。在每个Erlang节点和机器的组合中,节点名称必须唯一。 |
RABBITMQ_CONF_ENV_FILE | RabbitMQ环境变量的配置文件(rabbitmq-env.conf)的地址,默认值为$RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf 注意这里与RabbitMQ配置文件rabbitmq.config的区别 |
RABBITMQ_USE_LONGNAME | |
RABBITMQ_CONFIG_FILE | RabbitMQ配置文件(rabbitmq.config)的路径,注意没有“.config”的后缀,默认值为$RABBITMQ_HOME/etc/rabbitmq/rabbitmq |
RABBITMQ_MNESIA_BASE | RABBITMQ_MNESIA_DIR的父目录。除非明确设置了RABBITMQ_MNESIA_DIR目录,否则每个节点都应该配置这个环境变量。默认值为$RABBITMQ_HOME/var/lib/rabbitmq/mnesia 注意对于RabbitMQ的操作用户来说,需要有对当前目录可读、可写、可创建文件及子目录的权限。 |
RABBITMQ_MNESIA_DIR | |
RABBITMQ_LOG_BASE | RabbitMQ服务日志所在基础目录。默认值为$RABBITMQ_HOME/var/log/rabbitmq |
RABBITMQ_LOGS | RabbitMQ服务与Erlang相关的日志,默认值为$RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.log |
RABBITMQ_SASL_LOGS | |
RABBITMQ_PLUGINS_DIR |
注意,如果没有特殊的需求,不建议更改RabbitMQ的环境变量。如果在实际生产环境中,对于配置和日志的目录有着特殊的管理目录,那么可以参考一下相应的配置:
# 配置文件的地址
CONFIG_FILE=/apps/conf/rabbitmq/rabbitmq
# 环境变量的配置文件的地址
CONF_ENV_FILE=/apps/conf/rabbitmq/rabbitmq-env.conf
# 服务日志的地址
LOG_BASE=/apps/logs/rabbitmq
# Mnesia 的路径
MNESIA_BASE=/apps/dbdat/rabbitmq/mnesia
6.2 配置文件
6.2.1 配置项
6.2.2 配置加密
6.2.3 优化网络配置
6.3 参数及策略
RabbitMQ绝大多数的配置都可以通过修改rabbitmq.config配置文件来完成,但是其中有些配置并不太适合在rabbitmq.config中去实现。比如某项配置不需要同步到集群中的其他节点中,或者某项配置需要在运行时更改,因为rabbitmq.cinfig需要重启Broker才能生效。这种类型的配置在RabbitMQ中的另一种称呼为参数(Parameter),也可以称之为运行时参数(Runtime Parameter)。英文中的“arguments”也翻译为参数,比如channel.basicPublish方法中的参数就是指“arguments”,为了与之能够有效的区分,后边都使用Parameter或者Runtime Parameter的称谓来进行相应的阐述。
Parameter可以通过rabbitmqctl工具或者RabbitMQ Management插件提供的HTTP API接口来设置,RabbitMQ中一共有两种类型的Parameter:vhost级别的Parameter和global界别的Parameter。vhost级别的Parameter由一个组件名称(component name)、
vhost级别的参数对应的rabbitmqctl相关的命令有三种:
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
用来设置一个参数。示例如下(例子中演示的Federation upstream的Parameter设置,需要先开启rabbitmq_federation插件):
rabbitmqctl list_parameters
用来列出执行虚拟主机上所有
rabbitmqctl clear_parameter
用来清除指定
与rabbitmqctl 工具相对应
设置一个参数:
清除一个参数:
列出指定vhost中的所有参数:
global级别的Parameter
方式 | 详细内容 |
---|---|
global级别
除了一些
Policy 的介入就可以很好的解决这类问题,它是一种特殊的Parameter的用法。Policy是vhost级别的。一个Policy可以匹配一个或多个队列(或者交换器,或者两者兼有),这样便于批量管理。与此同时,Policy也可以支持动态地修改一些属性参数,大大地提高了应用的灵活度。一般来说,Policy用来配置Federation、镜像、备份交换器、死信等功能。
rabbitmq_management插件本身就提供了Policy的支持。可以在“admin”->“Policies”->“Add/update a policy”中添加一个Policy。参考图6-1,包含以下几个参数。
Vritual host:表示当前Policy所在的vhost是哪个。
Name:表示当前Policy的名称。
Pattern:一个正则表达式,用来匹配相关的队列或者交换器。
Apply to:用来指定当前Policy作用于哪一方。一共有三个选项——“Exchanges and queues”表示作用于与Pattern所匹配的所有队列和交换器;“Exchanges”表示作用于与Pattern所匹配的所有交换器;“Queues”表示作用于与Pattern所匹配的所有队列。
Priority:定义优先级。如果有多个Policy作用于同一个交换器或队列,那么Priority最大的那个Policy才会有用。
Definition:定义一组或多组键值对,为匹配的交换器或者队列附加相应的功能。
![](https://img-blog.csdnimg.cn/20210308142947303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbWVPcmFjbGU=,size_16,color_FFFFFF,t_70)
作为一种Parameter,Policy也可以通过rabbitmqctl工具或者HTTP API接口来操作。与前面所讲的Parameter对应,rabbitmqctl工具或者HTTP API接口各种都有set、clear和list的功能。
rabbitmqct set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
用来设置一个Policy。其中的参数name、pattern和definition是必填项,相关的参数细节可以参考图6-1中的参数。
示例如下,
对应的HTTP API
rabbitmqctl list_policies [-p vhost]