[一曲广陵不如晨钟暮鼓]
通过前面的一系列文章,我们给大家介绍了RabbitMQ的基本用法。从本文开始,我们将介绍关于RabbitMQ的服务器配置的相关内容,鉴于英语水平比较渣,建议各位看官在学习的时候最好对比官方文档一起看,如果发现不合适的地方,欢迎积极留言!
官方文档:http://www.rabbitmq.com/configure.html#configuration-file
--------------------------------------------------------------------------------------------------------------------------------------------------------
RabbitMQ configuration
概述
RabbitMQ本身内置了一份配置信息,并且很大程度上能够很好的满足大多数的应用场景。如果其能够正常运行的,那么你可能就不在需要配置其他任何信息了。
RabbitMQ提供3种通用的方式来满足服务器上个性化的需求:
- 环境变量(environment variables):默认端口,文件未知,节点名称(或者在shell上进行设置,或者在环境配置文件中配置,rabbitmq-env.conf/rabbitmq-env-conf.bat)
- 配置文件(a configuration file):用于设置服务器的各种组件的约束,如权限,范围,集群,插件等配置。
- 运行时参数和策略(runtime parameters and policies):用于设置对集群边界范围内的相关设置,这些设置可以在运行时改变。
大多数情况下,我们只需要配置前两项,因此,在本文中,我们也重点关注这两点内容。
配置文件的位置(Config File Locations)
默认的配置文件位置不同于操作系统和包类型。关于这个问题将在本文接下来的部分做详细介绍。
为了验证有效的RabbitMQ配置文件的位置,请阅读下面的内容。
验证配置(如何找到配置文件的位置)
实际生效的配置文件可以通过监视RabbitMQ的日志文件来验证。日志中将会显示顶端节点和其他broker引导的清单条目信息。如下:
node : rabbit@example
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
如果日志文件没有被RabbitMQ发现,清单信息显示为:
node : rabbit@example
home dir : /var/lib/rabbitmq
config file(s) : /var/lib/rabbitmq/hare.config (not found)
定制RabbitMQ环境
某些服务器参数可以使用环境变量进行配置,如:节点名称,RabbitMQ配置文件位置,AMQP 0-9-1,内部节点交流的端口,等等。
Unix(general)
在基于Unix的系统中,包裹Linux,MacOSX,你可以创建/编辑rabbitmq-env.cof 来定义环境变量。文件的位置可以使用RABBITMQ_CONF_ENV_FILE环境变量。
环境变量的标准使用方法,如下:(要去掉“RABBITMQ_”前缀)
#example rabbitmq-env.conf file entries
#Rename the node
NODENAME=bunny@myhost
#Config file location and new filename bunnies.config
CONFIG_FILE=/etc/rabbitmq/testdir/bunnies
更多内容请在rabbitmq-env.conf文件中查看
Windows
如果是在Windows环境下进行配置,这是最简单的方法:开始--->计算机--->右键,属性--->高级系统设置--->环境变量。接着,根据需要创建对应的环境变量即可,关于这个就不过多讲了,各位看官应该再熟悉不过了。
另一种可选的方式是,亦可以创建/编辑 rabbitmq-env-conf.bat文件来定义环境变量。其位置是通过配置环境变量中RABBITMQ_CONF_ENV_FILE进行设置。
在Window环境下,一旦环境信息发生变化,服务需要重新安装。直接重启服务显然是不够的。具体步骤,可以运行installer,或者用管理员权限打开命令行工具,步骤如下:
- 开启一个管理员权限的命令行窗口。
- 进入RabbitMQ安装目录下的sbin文件夹,如(C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.6.5\sbin)
- 运行命令:rabbitmq-service.bat remove
- 通过命令行设置环境变量,如:set RABBITMQ_BASE=c:\data\RabbitMQ
- 运行命令:rabbitmq-service.bat install
另外,如果新的配置需要在下一个broker重启之后才发挥作用的话,第一步是可以被跳过的。
RabbitMQ环境变量(RabbitMQ Environment Variables)
RabbitMQ所有环境变量的名称都是包括“RABBITMQ_”前缀的。典型的变量命名RABBITMQ_var_name按照如下方式定义:
- 优先级第一:如果在shell中定义了环境变量RABBITMQ_var_name,则优先使用该环境变量。
- 优先级第二:如果在rabbitmq-env.conf文件中配置var_name变量。
- 优先级第三:系统默认值。
按照上面设置规则,优先级数越小的,优先级越高。
但这并不意味着,你需要配置所有的环境变量。如果你有非标准化的需求的话,可以参考下面这张表格进行配置,但该表只列举了部分内容:
Name | Default | Description |
RABBITMQ_NODE_IP_ADDRESS | 空字符串---表明绑定所有网络接口 | 如果你只需要绑定唯一的一个网络接口,则可以对该项进行相关配置 |
RABBITMQ_NODE_PORT | 接口5672 | |
RABBITMQ_DIST_PORT | RABBITMQ_NODE_PORT+20000 | 用于集群的端口,如果你在配置文件中配置了inet_dist_listen_min 或者inet_dest_listen_max则该项配置被忽略 |
RABBITMQ_NODENAME | Unix*:rabbit@$HOSTNAME windows:rabbit@%COMPUTERNAME% | 节点名称需要在erlang-node-and-machine级别上做到唯一。 如果想运行多个节点,请参考集群教程的配置,我们后续再做相关介绍。 |
RABBITMQ_CONF_ENV_FILE | Unix*:$RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf Debain:/etc/rabbitmq/rabbitmq-env.conf RPM:/etc/rabbitmq/rabbitmq-env.conf Mac OS X:${install_prefix}/etc/rabbitmq-env.conf Windows:%APPDATA%\RabbitMQ\rabbitmq-env-conf.bat | 包含环境变量定义的文件的位置,(变量定义没有RABBITMQ_prefix)。 特别的,windows系统中的文件命名不同于其他的操作系统。 |
RABBITMQ_USE_LONGNAME | 当被设置为true时,RabbitMQ将使用节点的全路径名称来识别节点。 这在EC2上可能有有用的。 注意:在使用短名称,长名称之间不重新设置节点的条件下 ,节点是不能起作用的。 | |
RABBITMQ_SERVICENAME | Windows Service:RabbitMQ | 安装服务的名称,将出现在services.msc中。 |
RABBITMQ_CONSOLE_LOG | Windows Service | 该变量被设置为new或者reuse,从服务器控制台输出 重定向到文件%RABBITMQ_SERVICENAME%.debug中, 文件位于默认的RABBITMQ_BASE目录当中。 如果没有被设置,服务器上的控制台输出将会被丢弃(默认的)。 如果是new,每当一个服务器启动时,就会创建一个文件。 如果是reuse,每当一个服务器启动时,就会覆盖上一个文件。 |
RABBITMQ_CTL_ERL_ARGS | None | 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数,仅在调试状态下使用。 |
RABBITMQ_SERVER_ERL_ARGS | Unix*:“+K true+A30+P 1048576-kernel inet_default_connect_options[{nodelay,true}]" Windows:none | 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数,仅在调试状态下使用。 重写此变量用以替换默认值。 |
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS | Unix*:None Windows:None | 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数 该变量将被添加到默认参数的默认列表当中。 |
RABBITMQ_SERVER_START_ARGS | None | 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数。该参数不会覆盖掉 |
其他RabbitMQ需要依赖的环境变量如下:
Name | Default | Description |
HOSTNAME | Unix,linux:‘env hostname’ MacOSX:‘env hostname -s’ | 当前机器名称 |
COMPUTERNAME | Windows:localhost | 当前机器名称 |
ERLANG_SERVICE_MANAGER_PATH | Windows Service: %ERLANG_HOME%\erts-x.x.x\bin | erlsrv.exe的位置,Erlang服务包脚本。 |
配置文件(Configuration File)
rabbitmq.config 文件
该配置文件用于对核心应用,Erlang服务,RabbitMQ插件进行相关配置。该配置文件是标准的Erlang配置文件,在Erlang官网上有文件进行描述。
示例如下:
[
{rabbit, [{tcp_listeners, [5673]}]}
].
上面的这个示例的作用:将RabbitMQ监听的AMQP 0-9-1规范的客户端端口从5672上转移到5673上。
为了覆盖掉RabbitMQ配置文件位置,请使用RABBITMQ_CONFIG_FILE环境变量。
请注意:该配置文件不同于环境变量文件,rabbitmq-env.conf,其用于在非window系统能改下进行环境变量配置。
rabbitmq.config与rabbitmq-env.conf文件的位置
这两个文件的位置是官方指定的。默认情况下,其不能被创建,但是,其会被放置在下面这些位置上:
- Unix:$RABBITMQ_HOME/etc/rabbitmq/
- Debian:/etc/rabbitmq/
- RPM:/etc/rabbitmq/
- Mac OS X(Homebrew):${install_prefix}/etc/rabbitmq/,Homebrew前缀通常情况下是:/usr/local/
- Windows:%APPDATA%\RabbitMQ\
如果rabbitmq-env.conf文件不存在的话,其将会被手动创建,其位置为:环境变量RABBITMQ_CONF_ENV_FILE的值。在Windows操作系统中,其命名为rabbitmq-env.bat
如果rabbitmq.config文件不存在的话,其将会被手动创建。如果你改变为文件的位置,那么就需要修改RABBITMQ_CONFIG_FILE环境变量的值。Erlang在运行时会自动的将“.config”作为后缀拼接到你设置的值之后。
在修改完配置之后,你需要重新启动服务器。Windows系统的用户还需要再增加或者删除配置文件后重新安装服务器。(Windows好麻烦啊,Orz)
rabbitmq.config文件示例
RabbitMQ服务的源码仓库中已经包含了一份示例的配置文件:rabbitmq.config.example。这个配置文件中包含了你可能向想要配置(其中包含一些省略)的大部分配置项的一个示例,以及在本文中包含的一些配置项。该文件中的所有条目均是以被注释掉的形式给出,你可以根据自己的需要开放出响应条目使用。注意:示例文件仅作为示例,而不能作为推荐设置。
在大多数的发行版本当中,我们都把该文件放置在相同的位置,这也是该文件真正应该存放的位置。但是,对Debian和RPM这种做法是禁止的,所以,该文件分别被转移到了/usr/share/doc/rabbitmq-server/ 或者/usr/share/doc/rabbitmq-server-3.6.5/路径下。
rabbitmq.config中的变量配置(Variables Configurable in rabbitmq.config)
大多数用户不需要改变这些配置项的值,并且其中一些是相当难理解的。但是,为了完整性,我们还是给出所有配置项:(可能翻译不精确,望参考官方文档学习)
- key:Documentation
- tcp_listeners:监听AMQP连接(无SSL)的端口列表。可以包含证书(意思是监听器其上的所有端口)或者一组对应关系如“{“127.0.0.1”,5672}”来监听一个或多个接口。默认值为:[5672].
- num_tcp_acceptors:Erlang进程数,将接受TCP监听器的连接。默认值为:10.
- handshake_timeout:AMQP 0-8/0-9/0-9-1握手的最大时间,单位毫秒。(在socket连接和SSL握手之后),默认值为:10000.
- ssl_listeners:同上,用于SSL连接。默认值为:[]
- num_ssl_acceptors:Erlang进程数,将接受SSL监听器的连接。默认值为:1
- ssl_options:SSL配置,具体内容请查看SSL documentation文档:http://www.rabbitmq.com/ssl.html#enabling-ssl
- ssl_handshake_timeout:SSL握手的超时时间,单位毫秒。默认值为:5000
- vm_memory_high_watermark:触发流量控制的存储阈值。默认值为:0.4.具体内容请查看memory-based flow control文档:http://www.rabbitmq.com/memory.html
- vm_memory_high_watermark_paging_ratio:最大比例的上限,受限于哪个队列开始向磁盘写入消息来释放内存空间。默认值为:0.5、具体内容请查看memory-based flow control文档。
- disk_free_limit:RabbitMQ存储数据分区的磁盘空闲空间的限制。当磁盘的可用空间低于这一限制是,流控制触发。这个限制可能是RAM本身的总大小。(如{mem_relative,1.0})。也可能是被设置为一个整形的字节数。或者,可选择的,其他的信息单位如:50MB。默认情况下,磁盘空闲空间的大小限制小于50MB。更多内容请查看Disk Alarms文档:http://www.rabbitmq.com/disk-alarms.html。默认值为:50000000
- log_levels:控制日志的粒度。该值是一个日志时间类别和日志级别的列表。日志的级别可以为“none”“error”“warning”“info”“debug”。从前到后,每一级都会输出之前的所有界别。与平时使用的日志级别控制没有区别。但是,这里类别一共定义了4种,除此之外的事件都会被记录到。这些种类具体如下:channel--所有连接到AMQP channel的事件。connection--所有连接网络的事件。federation--所有互联的事件。mirroring--所有镜像队列的事件。默认值为:[{connection,info}]
- frame_max:与客户端交换数据的一个frame允许的最大值,单位:byte。设置为0,表示不设限制。但是将会触发QPid客户端的bug。设置一个较大的值可能会提高吞吐量,设置为一个较小的值可能会增大延迟。默认值为:131072
- channel_max:与客户端连接的最大的channel数量。设置为0,表示不设限制。使用更大的数字会增加broker内存占用。默认值为:0。
- channel_operation_timeout:channel操作的超时时间,单位:毫秒。(内部使用,不直接暴露给客户端,是因为消息传递协议的不同和局限性)。默认值为:15000.
- heartbeat:该值代表心跳延迟,单位:秒,其代表服务器发送给connection.tune框架。如果设置为0,心跳数被禁止。客户端可能不会遵从服务器发出的建议,具体详细内容请查看AMQP reference文档:http://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune。禁用心跳,可能会提升巨大连接数量下的性能表现,但同时,也可能导致网络设备关闭了不活动的连接。默认值为:60
- default_vhost:当RabbitMQ重新创建一个数据库时,将创建一个虚拟host。名称为amq.rabbitmq.log的exchange将会存在于整个虚拟host当中。默认值为:<<"/">>
- default_user:当RabbitMQ重新创建一个数据库时,使用的用户名。默认值为:<<"guest">>
- default_pass:同上,用户对应的密码。默认值为:<<"guest">>
- default_user_tags:默认用户的标签分组,默认值为:{administrator}
- default_permissions:创建用户时,为其分配的默认权限。默认值为:[<<".*">>,<<".*">>,<<".*">>]
- loopback_users:只允许通过一个loopback接口进行连接到broker的用户列表。(如:localhost)。如果你想允许默认的guest用户进行远程连接,那就需要将其设置到[]。默认值为:[<<"guest">>]
- cluster_nodes:开启此设置,将在一个节点正好第一次启动时,自动的进行集群连接。数据组的第一个元素表示节点尝试连接的地址,第二个元素只能是disc或者ram表示节点的类型。默认值为:{[],disc}
- server_properties:在连接上,向客户端声明的键值对的列表。默认值为:[]
- collect_statistics:统计集合类型。主要作用是进行管理插件。选项如下:none(不产生统计事件),coarse(产生 per-queue/per-channel/per-connection 统计),fine(在上面的基础上,再生成per-message 统计)。绝大部分情况,你不需要改变这里的配置。默认值为:none。
- collect_statistics_interval:统计集合间隔,单位:毫秒。主要作用在管理插件时。默认值为:5000.
- auth_mechanisms:为客户提供SASL认证机制。具体内容请查看文档:http://www.rabbitmq.com/authentication.html。默认值为:{"PLAIN","AMQPLAIN}
- auth_backends:认证/授权后端要使用的列表。该列表包括模块的名称(相同模块被同时用于身份验证和授权)或者2元数组,如{ModN,ModZ},在这种情况下,ModN用于认证,ModZ用于授权。ModZ可以被列表取代,所有元素必须确认被一个授权查询,如{ModN,[ModZ1,ModZ2]}。这种方式允许授权插件混合使用,并提供额外的安全约束。默认值为:{rabbit_auth_backend_internal}
- reverse_dns_lookups:设置为true,使得RabbitMQ执行一个反向DNS查找客户端连接,并且,通过rabbmitmqctl和管理插件呈现信息。默认值为:false。
- trace_vhost:通过跟踪器在内部使用,你不应该改变此配置。默认值为:[]
- tcp_listen_options:默认的socket选项。你不需要改变此配置。默认值为:[{backlog,128},{nodelay,true},{linger,{true,0}},{exit_on_close,close}]
- hipe_compile:设置为true,用HiPE(一个Erlang的即时编译器)预编译RabbitMQ的部分。这将在启动时间增加耗时,但增加了服务器的吞吐量。你可能会在启动时花费几分钟的延迟,而看到20%--50%的性能提升。HiPE支持,其可能不会被编译到你的Erlang的安装当中。如果它不是,启动此选项,将只会导致警告消息被显示出来,并且正常进行启动过程。举个例子:Debain/Ubuntu 用户将需要按照erlang-base-hipe包。HiPE并不适用于所有的平台,包括Windows。我们推荐使用最新版本的Erlang/OTP。默认值为:false。
- cluster_partition_handling:如何控制网络分片。可选的模式如下:ignore,pause_minority,{pause_if_all_down,{nodes},ignore|autoneal}其中{nodes}代表节点名称的列表,autoheal。更多内容请在documentation on partitions文档中查看:http://www.rabbitmq.com/partitions.html#automatic-handling。默认值为:ignore。
- cluster_keepalive_interval:节点向其他节点发送生存状态的消息的频率,单位:毫秒。注意:这个配置不同于net_ticktime,丢失生存状态的消息并不会导致节点下线。默认值为:10000.
- queue_index_embed_msgs_below:具体内容建议阅读persister tuning文档:http://www.rabbitmq.com/persistence-conf.html。默认值为:4096.
- msg_store_index_module:同上。默认值为:rabbitmq_msg_store_ets_index
- backing_queue_module:队列内容的实现模块。你可能不需要改变此配置。默认值为:rabbit_varible_queue
- msg_store_file_size_limit:缓冲区大小调解。绝大多数情况下,你不需要改变此配置。默认值为:16777216.
- mnesia_table_loading_timeout:在集群中,等待数据库表连接的超时时间。默认值为:30000.
- queue_index_max_journal_entries:缓冲区大小调解。绝大多数情况下,你不需要修改此配置。默认值为:65536
- queue_master_locator:队列主存储位置策略。可选择的如下:<<"min-masters">>,<<client-local>>,<<"random">>。更多内容请查看documentation on queue master location 文档:http://www.rabbitmq.com/ha.html#queue-master-location。默认值为:<<"client-local">>
更多关于插件的配置,请参考官方文档,如下:
http://www.rabbitmq.com/management.html#configuration
--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,系统拆分解耦利器之消息队列---RabbitMQ-Configuration 结束
特别备注:翻译不妥之处,还请积极留言。
参考资料:
官方文档:http://www.rabbitmq.com/configure.html