# 环境变量

RabbitMQ 的环境变量都是以 RABBITMQ_ 作为前缀,设置方式有如下两种:

  • Shell 环境中设置

    在 Shell 中设置,不需要 RABBITMQ_ 这个前缀;

    而且 优先级 shell 最高,也就是说,当 shell 和 rabbitmq-env.conf 同时设置了一个变量,则 shell 中的生效

  • rabbitmq-env.conf 环境变量配置文件中设置

    默认路径在 $RABBITMQ_HOME/etc/rabbitmq/ 目录下,可以在启动 RabbitMQ 服务时,指定 RABBITMQ_CONF_ENV_FILE 变量来设置此文件的路径

# 启动时使用环境变量

当采用 rabbitmq-server -detached 方式启动 RabbitMQ 服务时,此服务节点默认以 rabbit@当前 Sheel 环境的 hostname)(主机名)来命名。即 rabbit@$HOSTNAME

[root@study ~]# echo $HOSTNAME
study.centos.mrcode
[root@study ~]# hostname
study.centos.mrcode
1
2
3
4

如果是上面这样的,只会取第一个点前面的单词。

[root@study ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@study
[{nodes,[{disc,[rabbit@study]}]},
 {running_nodes,[rabbit@study]},
 {cluster_name,<<"rabbit@study">>},
 {partitions,[]},
 {alarms,[{rabbit@study,[]}]}]
1
2
3
4
5
6
7

要指定节点名称,可以在 rabbitmq-server 前添加变量来实现,如下所示

[root@study ~]# RABBITMQ_NODENAME=rabbit@study1 rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
ERROR: epmd error for host study1: nxdomain (non-existing domain)
1
2
3

环境变量的使用方式是正常了,但是貌似不能随意指定。可能和版本有关系。

# 通过配置文件使用环境变量

下面演示通过配置文件的方式来使用环境变量

# 进入配置文件目录
[root@study ~]# cd /opt/rabbitmq/etc/rabbitmq/
# 发现没有环境配置文件
[root@study rabbitmq]# ll
总用量 4
-rw-r--r--. 1 root root 23 629 05:03 enabled_plugins

# 我们新建这个文件
[root@study rabbitmq]# vim rabbitmq-env.conf
# 然后写一个 nodename 的变量
NODENAME=rabbit@node1

# 再启动看看该文件是否有生效,根据之前的测试,会读取到这个变量,并且会报错
[root@study rabbitmq]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
ERROR: epmd error for host node1: nxdomain (non-existing domain)
# 能读取到,并且报错了,配置文件是生效的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

对于默认的取值规则,可以在 $RABBITMQ_HOME/sbin/rabbitmq-defaults 文件中查看

[root@study sbin]# cat /opt/rabbitmq/sbin/rabbitmq-defaults
#!/bin/sh -e

### next line potentially updated in package install steps
SYS_PREFIX=${RABBITMQ_HOME}

### next line will be updated when generating a standalone release
ERL_DIR=

CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl

if [ -f "${RABBITMQ_HOME}/erlang.mk" ]; then
    # RabbitMQ is executed from its source directory. The plugins
    # directory and ERL_LIBS are tuned based on this.
    RABBITMQ_DEV_ENV=1
fi

## Set default values

BOOT_MODULE="rabbit"

CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins

PLUGINS_DIR="${RABBITMQ_HOME}/plugins"

# RABBIT_HOME can contain a version number, so default plugins
# directory can be hard to find if we want to package some plugin
# separately. When RABBITMQ_HOME points to a standard location where
# it's usually being installed by package managers, we add
# "/usr/lib/rabbitmq/plugins" to plugin search path.
case "$RABBITMQ_HOME" in
    /usr/lib/rabbitmq/*)
        PLUGINS_DIR="/usr/lib/rabbitmq/plugins:$PLUGINS_DIR"
        ;;
esac

CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
# 可以看到在这里引用了 rabbitmq-env.conf 路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

先给出官方的配置文档:

下面总结一些常用的 RabbitMQ 变量,完成的变量还是去官方查找(笔者发现下面的某些变量在最新版本的官方文档中就已经不在了,还是需要去官方文档看才保险)

  • RABBITMQ_NODE_PORT

    监听客户端链接的端口号。

    默认为 5672

  • RABBITMQ_DIST_PORT

    RabbitMQ 节点内部通信端口,默认值为 RABBITMQ_NODE_PORT + 20000,即 25672,如果设置了 kernel.inet_dist_listen_min 或 kernel.inect_dist_listen_max 则此环境失效

  • RABBITMQ_NODENAME

    RabbitMQ 节点名称,默认为 rabbit@$HOSTNAME,在每个 Erlang 节点和集群的组合中,节点名称必须唯一

  • RABBITMQ_CONF_ENV_FILE

    环境变量配置文件地址,指定文件 rabbitmq-env.conf 的地址。

    默认值为 #RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf

  • RABBITMQ_USE_LONGNAME

    使用长名称命名,如果当前的 hostname 为 node1.longname,那么默认情况下创建的节点名为 rabbit@node1。

    将此参数设置为 true 时,创建的节点名称为 rabbit@node1.longname

  • RABBITMQ_CONFIG_FILE

    配置文件路径。

    默认值为 $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 服务节点的数据库、数据存储及集群状态等目录

    默认值为:$RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME

  • RABBITMQ_LOGS

    RabbitMQ 服务于 Erlang 相关的日志。

    默认值为 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.log`

  • RABBITMQ_LOG_BASE

    RabbitMQ 服务日志所在基础目录。

    默认值为 $RABBITMQ_HOME/var/log/rabbitmq

  • RABBITMQ_SASL_LOGS

    RabbitMQ 服务与 Erlang 的 SASL(System Application Support Libraries)相关的日志。

    默认值为 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME-sasl.log

  • RABBITMQ_PLUGINS_DIR

    插件所在路径。

    默认值为 $RABBITMQ_LOG_BASE/plugins

如果没有特殊需求,不建议更改 RabbitMQ 环境变量。在生产环境中,对于配置和日志有特殊的管理目录,那么可以参考以下相应的配置:

# 配置文件地址
CONFIG_FILE=/apps/conf/rabbitmq/rabbitmq
# 环境变量的配置文件地址
CONF_ENV_FILE=/apps/conf/rabbitmq/rabbitmq-env.conf
# 服务日志地址
LOG_BASE=/apps/logs/rabbitmq
# mnesia 路径
MNESIA_BASE=/app/dbdat/rabbitmq/mnesia

1
2
3
4
5
6
7
8
9