> 技术文档 > 保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装


保姆级教程:手把手带你安装 RabbitMQ

  • 保姆级教程:手把手带你安装 RabbitMQ
    • 一、下载软件包
    • 二、上传软件包到服务器
    • 三、安装
      • 3.1 创建用户组和用户
      • 3.2 安装Erlang运行环境
      • 3.3 解压 rabbitmq-server 软件包
      • 3.4 添加环境变量
      • 3.5 将`rabbitmq_server`做成系统服务
      • 3.6 设置开机启动
      • 3.7 启动 rabbitmq-server
    • 四、配置用户、权限、核心参数
      • 4.1 通过静态配置文件
      • 4.2 通过 rabbitmqctl 命令配置
    • 五、了解 web 管理页面
      • 5.1 登录 web 管理页面
      • 5.2 核对节点的参数
    • 六、问题排查
      • 6.1 rabbitmq 启动失败怎么办
      • 6.2 无法打开 web 管理页面
      • 6.3 rabbitmqctl 命令执行时报错

保姆级教程:手把手带你安装 RabbitMQ

一、下载软件包

本文使用的 rabbitmq_server是 3.6.1 版本,

配套的erlang是17.4,软件包我已经放在了Gitee仓库里面。

我的操作系统是 CentOS 7。

RabbitMQ版本 Erlang最低版本 操作系统 3.6.1 17.4 CentOS 7

如果你想使用较新版本,可以从 GitHub 下载:

上周最新发布的版本已经是4.1.0版本了,点击这里跳转到rabbitmq-server在 GitHub 上的 Release 页面。

RabbitMQ 是基于 Erlang 语言开发的,所以它的运行需要有 Erlang 运行环境。erlang-rpm是由 RabbitMQ 团队维护的,用于制作精简版的 erlang 软件包,仅提供运行 RabbitMQ 所需的组件。如果你只是 RabbitMQ 中使用,那必须推荐使用这种方式安装。

erlang-rpm 在 GitHub 上的 Release 页面,点击这里可以跳转过去。

二、上传软件包到服务器

上传这两个软件包到你的Linux环境下,本文以上传到/app目录为例:

  • erlang软件包:erlang-17.4-1.el6.x86_64.rpm
  • rabbitmq_server软件包:rabbitmq_server-3.6.1.zip

如果没有/app目录就创建一下吧,或者使用其他的目录也行,看你喜欢放在什么位置。

mkdir -p /app

三、安装

3.1 创建用户组和用户

这里需要注意哦,我登录服务器、上传软件包,使用的都是dapp用户。

我也是直接使用dapp用户进行安装。

dapp用户是我自己日常开发使用的用户,很早之前就已经创建了的。

所以,如果你也是直接使用当前用户安装,则不需要执行下述的命令了。

如果你想使用rabbitmq用户进行安装(建议这样),则需要先新增用户组和用户,

你需要有执行命令的权限,如果当前是 root 用户,则执行:

[root@MyLinux ~]# groupadd rabbitmq[root@MyLinux ~]# useradd -r -g rabbitmq rabbitmq

如果当前是非 root 用户,则执行下述命令,

这要求 groupadd 和 useradd 命令在 dapp 用户的sudo 命令列表之中,否则也没有权限:

[dapp@MyLinux ~]# sudo groupadd rabbitmq[dapp@MyLinux ~]# sudo useradd -r -g rabbitmq rabbitmq

3.2 安装Erlang运行环境

cd /app && sudo rpm -ivh erlang-17.4-1.el6.x86_64.rpm

3.3 解压 rabbitmq-server 软件包

cd /app# 解压,得到 rabbitmq_server-3.6.1 文件夹unzip rabbitmq_server-3.6.1.zip# 做个软链接ln -s rabbitmq_server-3.6.1 rabbitmq

如果你还没有 unzip 命令,可以执行如下命令安装:

sudo yum install -y unzip

3.4 添加环境变量

rabbitmq_server的可执行文件、管理工具都位于/app/rabbitmq_server-3.6.1/sbin目录之下,

我们把这个路径添加到到PATH变量之中,方便我们执行 rabbitmq 的维护命令。

vim ~/.bash_profile# 将 /app/rabbitmq/sbin 追加到 PATH 变量后面,然后 :wq 保存关闭文件PATH=$PATH:$HOME/.local/bin:$HOME/bin:/app/rabbitmq/sbin# 执行脚本使环境变量实时生效. ~/.bash_profile

你也可以添加到 /etc/profile 文件中,这样就是对所有用户都生效了。

3.5 将rabbitmq_server做成系统服务

# 切换到临时目录cd /tmp# 再使用 vim 创建这个文件vim rabbitmq-server.service

将下面的内容,拷贝到这个rabbitmq-server.service文件之中,然后 :wq 保存关闭文件。

注意了,如果你前面使用的不是/app目录,那要注意修改下面涉及到的路径哦。这份配置里面也包含了日志的路径。

[Unit]Description=RabbitMQ brokerAfter=network.target epmd@0.0.0.0.socketWants=network.target epmd@0.0.0.0.socket[Service]Type=simple# 使用你的实际用户,我使用的是 dapp 用户User=dapp# 使用你的实际用户组Group=dapp# 缩短启动超时时间(避免卡死)TimeoutStartSec=60# 停止超时时间TimeoutStopSec=30# 崩溃后自动重启Restart=on-failure# 重启间隔RestartSec=10# 指定工作目录WorkingDirectory=/app/rabbitmq# 重要!将 HOME 指向安装目录Environment=HOME=/app/rabbitmq# 数据目录指向 /app/rabbitmq/dataEnvironment=RABBITMQ_MNESIA_BASE=/app/rabbitmq/data# 日志目录显式声明Environment=RABBITMQ_LOG_BASE=/app/rabbitmq/log# 文件描述符限制LimitNOFILE=65536# 启动 rabbitmq-serverExecStart=/app/rabbitmq/sbin/rabbitmq-server# 使用 rabbitmqctl 停止服务ExecStop=/app/rabbitmq/sbin/rabbitmqctl stop[Install]WantedBy=multi-user.target

再执行下述命令,将这个文件,拷贝到系统服务目录之下,并使之生效。

# 拷贝过去sudo cp /tmp/rabbitmq-server.service /etc/systemd/system/rabbitmq-server.service# 重新加载 Systemd 配置sudo systemctl daemon-reload

然后我们就可以愉快的使用下述命令来操作 rabbitmq 的启动、停止、检查状态了。
下述的 6 条命令,你不要马上就执行了哈,这里只是告诉你,可以这么玩。

# 启用 RabbitMQ 服务开机启动sudo systemctl enable rabbitmq-server# 禁用 RabbitMQ 服务开机启动sudo systemctl disable rabbitmq-server# 启动 RabbitMQ 服务sudo systemctl start rabbitmq-server# 检查 RabbitMQ 服务状态sudo systemctl status rabbitmq-server# 停止 RabbitMQ 服务:sudo systemctl stop rabbitmq-server# 重启 RabbitMQ 服务:sudo systemctl restart rabbitmq-server

3.6 设置开机启动

RabbitMq作为Server,一般情况下,都是需要设置开启启动的。

我们生产环境,前端时间就有一台高配物理机,因硬件故障,凌晨自动重启了。

经排查,是因为一根内存条和一个CPU2故障,导致服务器重启了。

下图是使用 who -b 查到的系统重启时间
保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

所以,设置开启启动,是很有必要的。

RabbitMQ 节点上线,还可以正常提供服务。

通过执行下述命令,设置开机启动:

# 启用 开机启动sudo systemctl enable rabbitmq-server

执行之后,会有如下提示,代表设置 OK 了。

Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /etc/systemd/system/rabbitmq-server.service.

3.7 启动 rabbitmq-server

紧接着我们要开始进行一些配置了,必须要先启动rabbitmq-server才能进行设置。

执行如下命令,启动服务,顺手再检查一下服务状态。

# 启动 RabbitMQ 服务sudo systemctl start rabbitmq-server# 检查 RabbitMQ 服务状态sudo systemctl status rabbitmq-server

四、配置用户、权限、核心参数

有两种方式,来配置用户、权限、虚拟主机、服务核心参数阈值等。

我使用的是第一种方式,静态配置文件。

4.1 通过静态配置文件

编辑配置文件,防止重启配置丢失。

使用 vim 命令编辑这个配置文件

vim /app/rabbitmq/etc/rabbitmq/rabbitmq.config

将下面的文本,拷贝进去,注意修改其中的用户名和密码,然后:wq保存退出。

[ {rabbit, [ {default_vhost, <>}, {default_user, <>}, {default_pass, <>}, {default_permissions, [<>, <>, <>]}, {default_user_tags, [administrator]}, {hipe_compile, true}, {log_levels, [{connection, info}, {channel, info}]}, {vm_memory_high_watermark_paging_ratio, 0.6}, {vm_memory_high_watermark, 0.4} ]}].

配置完成之后,使用下面的命令重启一下 rabbitmq-server,保证配置生效。

# 重启 RabbitMQ 服务:sudo systemctl restart rabbitmq-server

4.2 通过 rabbitmqctl 命令配置

你也可以执行下述命令进行配置,但不会持久化到静态配置文件​中,

而是存储在 RabbitMQ 的​内部数据库(Mnesia)​​ 中,​服务重启后依然有效​​。

但若删除了 Mnesia 数据,则配置丢失。

# 查看所有的用户rabbitmqctl list_users# 查看 guest 用户的权限rabbitmqctl list_user_permissions guest# 删除 guest 用户rabbitmqctl delete_user guest# 新增一个用户,并设置密码rabbitmqctl add_user mqadmin 2025V8#Hello# 设置为管理员rabbitmqctl set_user_tags mqadmin administrator# 设置 mqadmin 的权限# 这里意指在虚拟主机 /(RabbitMQ 的默认虚拟主机)上配置 「完整的权限控制」rabbitmqctl set_permissions -p / mqadmin \".*\" \".*\" \".*\"# 查看 mqadmin 用户的权限rabbitmqctl list_user_permissions mqadmin

五、了解 web 管理页面

RabbitMQ 的 Web 管理界面​ 是由官方插件 ​rabbitmq_management​ 提供的。

这个插件基于 HTTP API 构建,提供了一个可视化 WEB 界面,用于监控和管理 RabbitMQ 服务器、交换机、队列、用户权限等。

通过浏览器访问管理界面时,默认端口 15672,这个端口是可以修改的。

5.1 登录 web 管理页面

然后就可以登录 web 管理页面,详细看下各种指标、参数是否正常。

如果你的服务器IP地址是 192.168.3.27,那就在浏览器输入:

http://192.168.3.27:15672

使用上述 rabbitmq.config 配置文件中的用户名和密码,登录;

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

5.2 核对节点的参数

展开 Node 这一段,检查下述的参数。

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

这里我们可以看到,RabbitMQ 把文件描述符分成了:
File descriptors 和 Socket descriptors。

我们知道,在 Linux 操作系统下,有一种经典的设计哲学:​​“一切皆文件”(Everything is a file)​​,那为什么在这里,RabbitMQ 区分开了呢?

主要是因为,File descriptors(文件描述符)和 Socket descriptors(套接字描述符),
本质上是两种不同的系统资源限制指标,用在不同的 I/O 场景之下。

​(1)​File descriptors(文件描述符) ​:
用于操作 ​​本地文件​​(如日志、持久化消息存储),比如消息持久化到磁盘、日志写入等场景;

(2)​Socket descriptors(套接字描述符) :​
用于 ​网络通信​(如客户端连接、集群节点间通信),比如:客户端连接、集群节点同步、插件通信(如 MQTT/STOMP)。

分开统计的好处是,可以精准的定位系统瓶颈所在。

如果是文件描述符耗尽, 那可能是磁盘 I/O 过载或者日志写入频繁。
在队列开启了持久化场景下,持久化的消息是按分片存储的,每个分片是一个独立的文件。
当消息量激增时,新的分片文件被频繁创建,旧的分片可能仍然处理打开状态(等待合并或者删除)。

如果是套接字描述符耗尽, 那就可能是客户端连接过多。

对于 Memory(内存)和 Disk Space(磁盘空间)这两个指标,
也要检查其高水位(high watermark),也就是上限阈值,设置的是否合理。
如果 RabbitMQ 节点的内存和磁盘使用量,超过了这个高水位,
节点会触发保护机制,防止节点因资源耗尽而崩溃。
这也很好理解,操作系统好比官家,官家治世,讲究个度。
若你(进程)贪得无厌,官家自会「按律处置」,
夺你符印(回收内存),或逐出朝堂(kill -9)。
扯远了。。。。。。。

当内存或磁盘使用量超过阈值时,RabbitMQ 会有如下 3 个表现:

  • ​阻塞生产者​​(停止接收新消息)。
  • ​丢弃非持久化消息​​(内存不足时)。
  • ​强制关闭连接​​(极端情况下)。

比较明显的现象就是,你会发现操作 MQ 接口的线程,卡死了,就是被阻塞了。

六、问题排查

6.1 rabbitmq 启动失败怎么办

(1)执行下述命令,先收集情况

# 检查端口占用sudo netstat -antp | grep LISTEN | egrep \":5672|:15672\"# 检查进程残留# beam.smp: Erlang 虚拟机进程# epmd: Erlang 端口映射守护进程ps -ef | egrep \"beam|epmd\"

如果发现有进程残留,则杀死所有残留的 RabbitMQ/Erlang 进程

pkill -9 beam.smppkill -9 epmd

(2)删除日志和数据

# 删除日志/bin/rm -fv /app/rabbitmq/log/*.log# 删除旧的 Mnesia 数据库和节点信息(​​谨慎操作,会丢失所有数据​)/bin/rm -rfv /app/rabbitmq/data/mnesia/

一般来讲,启动失败,是因为有一些持久化数据,遭到了破坏。

可能是服务还在运行时,强制 kill 导致的。

比较有用的,就是删除旧的 Mnesia 数据库和节点信息,从头再来​了。

6.2 无法打开 web 管理页面

这个大概率就是防火墙的原因。

执行下述命令,开放防火墙端口(15672、5672)。

sudo firewall-cmd --add-port={5672,15672}/tcp --permanentsudo firewall-cmd --reload

6.3 rabbitmqctl 命令执行时报错

按照本教程安装完成之后,如果你使用 rabbitmqctl list_users, 会得到如下错误。

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

[dapp@cs01-phy ~]$ rabbitmqctl list_usersError: unable to connect to node \'dxmq@cs01-phy\': nodedownDIAGNOSTICS===========attempted to contact: [\'dxmq@cs01-phy\']dxmq@csmssvr01-phy: * connected to epmd (port 4369) on csmssvr01-phy * epmd reports node \'dxmq\' running on port 25672 * TCP connection succeeded but Erlang distribution failed * suggestion: hostname mismatch? * suggestion: is the cookie set correctly? * suggestion: is the Erlang distribution using TLS?current node details:- node name: \'rabbitmq-cli-41@cs01-phy\'- home dir: /home/dapp- cookie hash: CexviT8XR/RDQNx/xnb1fw==[dapp@cs01-phy ~]$ 

仔细看一下报错的信息,错误的原因是「nodedown」,
可能的原因,也有提示:

  • hostname mismatch 主机名不匹配
  • cookie不正确
  • Erlang分布式使用了TLS

我先抛出答案,
原因是:cookie不正确,需要保证cookie一致。
也就是说,需要将rabbitmq-server的安装目录下的.erlang.cookie文件,拷贝到你执行rabbitmqctl命令的用户的home目录下面,这个问题就解决了。
那么.erlang.cookie是什么?要保证谁和谁的cookie一致?

当你执行 rabbitmqctl list_users命令时,底层的步骤是:

(1)rabbitmqctl 命令作为客户端,会尝试连接到本地 RabbitMQ 节点,也就是本机安装的尝RabbitMQ-Server服务端,(默认节点名:rabbit@,我们这里不会使用这个默认的节点名)。

在配置文件 /app/rabbitmq/etc/rabbitmq/rabbitmq-env.conf 中,
我们指定了节点名是 dxmq,
本机的 hostname 是 cs01-phy ,
所以完整的节点名称是 dxmq@cs01-phy。
主机名当然是可以解析的,可以使用 ping 命令试一下。
保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

如果你使用 rabbitmqctl 命令,访问另外一台服务器上 rabbitmq-server 有哪些用户,
你需要增加 -n node 参数,这个时候你可能手误输错主机名,
如果主机名无法解析,就会报错 hostname mismatch
这就是这个错误的来源;

(2)rabbitmqctl 根据上一步确定了服务端的地址之后,现在要开始建立​ Erlang 分布式通信了,Erlang 分布式通信端口是25672。

这里插一嘴,我们看下 rabbitmq-server 会监听哪些端口?

sudo netstat -antp | egrep \'Proto|LISTEN.*beam|LISTEN.*epmd\'

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

  • 4369端口:(核心端口) 这个是 EPMD 进程监听的端口,EPMD 是 Erlang Port Mapper Daemon,也就是 Erlang 分布式系统的端口映射服务,负责管理 Erlang 节点之间的通信端口。RabbitMQ 集群节点会通过 EPMD 查找其他节点的实际通信端口(如 25672)。

  • 5672端口:(核心端口) 这是AMQP 默认端口,RabbitMQ 的核心消息协议(AMQP 0-9-1)默认端口,客户端(生产者/消费者)通过此端口连接。

  • 15672端口:(核心端口) HTTP API 和管理界面端口,RabbitMQ 的 Web 管理插件(rabbitmq-management)端口,提供可视化管理和 REST API。

  • 25672端口:(核心端口) Erlang 分布式通信端口。RabbitMQ 节点间通信(如集群组建、镜像队列同步)的 Erlang 分布式协议端口。客户端工具(如 rabbitmqctl)也通过此端口与节点交互。

  • 1883端口:(扩展协议端口) MQTT 协议端口。支持 MQTT 协议(需启用插件 rabbitmq_mqtt),常用于 IoT 设备或轻量级消息客户端。这是个扩展协议,不同的协议有不同的端口。

还有一些其他可能用到的端口​,比如与 TLS 相关的,这里就不再​啰嗦了。

第一步, rabbitmqctl 连接 EPMD​​ (Erlang Port Mapper Daemon,Erlang的端口映射守护进程服务,默认端口 4369)查询目标节点的 25672 端口,如果 EPMD 未运行或端口不通,会报错 epmd timeout

第二步, rabbitmqctl 与 rabbitmq-server 的 25672 端口建立 TCP 连接。从上面的报错信息可以看到,与 25672 端口的TCP连接是成功的。

保姆级教程:手把手带你安装 RabbitMQ_rabbitmq安装

第三步, but Erlang distribution failed的原因:Cookie 不匹配导致的

Erlang 节点间通信必须使用相同的 Cookie,否则拒绝连接,这类似于鉴权时的密钥。

服务端​ rabbitmq-server 的 Cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 路径之下(默认情况下)。
​​是当 RabbitMQ ​​首次启动​​时,如果不存在,则随机生成一个字符串存于其中。
而我们这里由于是自定义安装,.erlang.cookie 的位置在安装目录之下,
也就是 /app/rabbitmq/.erlang.cookie,
注意,是个隐藏文件哦,需要使用 ls -al 才能看到。

ls -al /app/rabbitmq/.erlang.cookie

客户端工具 rabbitmqctl,在你执行 rabbitmqctl list_users 命令时,
会尝试读取当前用户的home目录下的文件,也就是 ~/.erlang.cookie
如果你是第一次执行这个命令,那么 .erlang.cookie是不存在的,会生成一个。
你可以执行下面命令看下是否存在;

ls -al ~/.erlang.cookie

我们使用下述命令,看下内容是否一致

cat /app/rabbitmq/.erlang.cookieFALWWORJVOTKASSZEBJRcat ~/.erlang.cookieOGOITBTIAMVLYPGHOSVE

你会发现,二者是不一致的,
这就是 rabbitmqctl list_users 命令执行失败的原因了。
解决方法也很简单,
删掉~/.erlang.cookie,
把/app/rabbitmq/.erlang.cookie拷贝过去。

/bin/rm -fv ~/.erlang.cookiecp -v /app/rabbitmq/.erlang.cookie ~

然后再执行命令,就不会报错了。

[dapp@cs01-phy ~]$ rabbitmqctl list_usersListing users ...rmqadmin [administrator][dapp@cs01-phy ~]$ 

虽然是长篇大论,但仍然是把这个问题搞清楚了,而且过程中有了更深入的了解。
所以出现问题的时候就是学习的最佳时机。