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
  1. [root@study ~]# echo $HOSTNAME
  2. study.centos.mrcode
  3. [root@study ~]# hostname
  4. study.centos.mrcode
  5. Copied!

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

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

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

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

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

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

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

  1. # 进入配置文件目录
  2. [root@study ~]# cd /opt/rabbitmq/etc/rabbitmq/
  3. # 发现没有环境配置文件
  4. [root@study rabbitmq]# ll
  5. 总用量 4
  6. -rw-r--r--. 1 root root 23 6 29 05:03 enabled_plugins
  7. # 我们新建这个文件
  8. [root@study rabbitmq]# vim rabbitmq-env.conf
  9. # 然后写一个 nodename 的变量
  10. NODENAME=rabbit@node1
  11. # 再启动看看该文件是否有生效,根据之前的测试,会读取到这个变量,并且会报错
  12. [root@study rabbitmq]# rabbitmq-server -detached
  13. Warning: PID file not written; -detached was passed.
  14. ERROR: epmd error for host node1: nxdomain (non-existing domain)
  15. # 能读取到,并且报错了,配置文件是生效的
  16. Copied!

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

  1. [root@study sbin]# cat /opt/rabbitmq/sbin/rabbitmq-defaults
  2. #!/bin/sh -e
  3. ### next line potentially updated in package install steps
  4. SYS_PREFIX=${RABBITMQ_HOME}
  5. ### next line will be updated when generating a standalone release
  6. ERL_DIR=
  7. CLEAN_BOOT_FILE=start_clean
  8. SASL_BOOT_FILE=start_sasl
  9. if [ -f "${RABBITMQ_HOME}/erlang.mk" ]; then
  10. # RabbitMQ is executed from its source directory. The plugins
  11. # directory and ERL_LIBS are tuned based on this.
  12. RABBITMQ_DEV_ENV=1
  13. fi
  14. ## Set default values
  15. BOOT_MODULE="rabbit"
  16. CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
  17. LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
  18. MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
  19. ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins
  20. PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
  21. # RABBIT_HOME can contain a version number, so default plugins
  22. # directory can be hard to find if we want to package some plugin
  23. # separately. When RABBITMQ_HOME points to a standard location where
  24. # it's usually being installed by package managers, we add
  25. # "/usr/lib/rabbitmq/plugins" to plugin search path.
  26. case "$RABBITMQ_HOME" in
  27. /usr/lib/rabbitmq/*)
  28. PLUGINS_DIR="/usr/lib/rabbitmq/plugins:$PLUGINS_DIR"
  29. ;;
  30. esac
  31. CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
  32. # 可以看到在这里引用了 rabbitmq-env.conf 路径
  33. Copied!

先给出官方的配置文档:

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

  • RABBITMQ_NODE_PORT监听客户端链接的端口号。默认为 5672
  • RABBITMQ_DIST_PORTRabbitMQ 节点内部通信端口,默认值为 RABBITMQ_NODE_PORT + 20000,即 25672,如果设置了 kernel.inet_dist_listen_min 或 kernel.inect_dist_listen_max 则此环境失效
  • RABBITMQ_NODENAMERabbitMQ 节点名称,默认为 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_BASERABBITMQ_MNESIA_DIR 的父目录。除非明确设置了 RABBITMQ_MNESIA_DIR 目录,否则每个节点都应该配置这个环境变量默认值为:$RABBITMQ_HOME/var/lib/rabbitmq/mnesia对于 RabbitMQ 的操作用户来说,需要对当前目录可读、科协、可创建文件及子目录的权限
  • RABBITMQ_MNESIA_DIR包含 RabbitMQ 服务节点的数据库、数据存储及集群状态等目录默认值为:$RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME
  • RABBITMQ_LOGSRabbitMQ 服务于 Erlang 相关的日志。默认值为 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.log`
  • RABBITMQ_LOG_BASERabbitMQ 服务日志所在基础目录。默认值为 $RABBITMQ_HOME/var/log/rabbitmq
  • RABBITMQ_SASL_LOGSRabbitMQ 服务与 Erlang 的 SASL(System Application Support Libraries)相关的日志。默认值为 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME-sasl.log
  • RABBITMQ_PLUGINS_DIR插件所在路径。默认值为 $RABBITMQ_LOG_BASE/plugins

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

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