在虚拟机里搭建RabbitMQ,核心步骤是:先准备一台Linux虚拟机并配置好网络环境,然后按顺序安装Erlang和RabbitMQ服务端,最后开启管理插件并通过端口转发访问Web控制台。整个过程大约需要20分钟,适合开发环境快速验证消息队列功能,下面直接给出可操作的详细步骤。
搭建前的环境准备:虚拟机与系统选择
虚拟机搭建RabbitMQ与物理机安装没有本质区别,但有几个前置条件需要确认,如果你用的是VMware Workstation或VirtualBox,建议给虚拟机分配至少2核CPU和2GB内存,磁盘空间20GB即可,RabbitMQ是纯Erlang应用,对硬件要求不高,但内存太小会导致启动缓慢。
操作系统推荐CentOS 7.9或Ubuntu 22.04 LTS,国内生产环境用CentOS的比例仍然较高,但CentOS 7已停止维护,如果追求长期稳定,Rocky Linux 9是更合适的选择,行业共识认为,消息中间件这类基础组件,运行环境的稳定性优先级高于版本新特性。
虚拟机网络模式选择NAT即可,安装完成后,先执行 yum update -y(CentOS系)或 apt update && apt upgrade -y(Ubuntu系)更新系统,更新完毕后,用 ip addr 确认虚拟机能正常获取IP地址,能ping通外网。
关闭防火墙与SELinux(CentOS系必做)
CentOS默认开启firewalld和SELinux,会拦截RabbitMQ的5672和15672端口,在安装前先处理掉,避免排查问题时分心:
# 停止并禁用防火墙 systemctl stop firewalld systemctl disable firewalld # 临时关闭SELinux setenforce 0 # 永久关闭SELinux(修改配置文件) sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
Ubuntu用户不需要处理SELinux,用 ufw disable 关闭防火墙即可,虚拟机环境没有公网暴露风险,这笔操作是安全的。
CentOS虚拟机安装RabbitMQ详细步骤
CentOS系安装RabbitMQ有两种主流方式:yum仓库安装和Docker安装,yum方式更贴近传统运维习惯,Docker方式则更干净,这里优先讲yum方式,因为它是虚拟机搭建RabbitMQ详细步骤里最常被搜索的路径。
第一步:安装Erlang依赖
RabbitMQ与Erlang有严格的版本对应关系,用系统自带的yum源安装Erlang通常版本过旧,会导致RabbitMQ启动失败,建议使用Erlang Solutions仓库:
# 安装必要的依赖工具 yum install -y epel-release yum install -y unzip wget # 添加Erlang仓库(以RabbitMQ 3.12.x为例,对应Erlang 25.x) wget https://packages.erlang-solutions.com/erlang/rpm/centos/rpm-centos7.repo mv rpm-centos7.repo /etc/yum.repos.d/ # 安装Erlang yum install -y erlang-25.0.4
验证Erlang是否安装成功:
erl -version
如果输出类似 Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 13.x 的版本信息,说明安装正常。注意不要用yum install erlang直接装,CentOS 7默认源里的Erlang是R16B03,老得无法配合新版RabbitMQ工作。
第二步:安装RabbitMQ服务端
截至2026年,RabbitMQ 3.13.x是稳定版本线,使用官方提供的PackageCloud仓库安装:
# 添加RabbitMQ仓库 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash # 安装RabbitMQ yum install -y rabbitmq-server-3.13.7
安装完成后,启动服务并设置开机自启:
systemctl enable --now rabbitmq-server systemctl status rabbitmq-server
看到 active (running) 状态就说明服务端已经跑起来了,RabbitMQ默认监听5672端口,用 ss -tlnp | grep 5672 可以验证端口监听正常。
第三步:开启Web管理插件
RabbitMQ自带一个功能完整的Web管理界面,默认没有开启,执行下面命令启动:
rabbitmq-plugins enable rabbitmq_management
开启后,15672端口会开始监听HTTP请求,此时在虚拟机内访问 http://localhost:15672 应该能看到登录页面,默认账号密码是 guest/guest,但guest账号只允许通过localhost访问,稍后需要创建远程可访问的管理账号。
配置虚拟机端口转发与远程访问
RabbitMQ虚拟机安装教程做到这一步,卡住的人最多,明明服务起来了,宿主机访问却不通,原因几乎都是端口转发没配置或账号权限受限。
修改guest账号限制(开发环境推荐)
如果只是本机调试,修改RabbitMQ配置文件允许guest远程访问即可:
# 修改配置文件 vi /etc/rabbitmq/rabbitmq.conf # 添加下列三行 loopback_users.guest = false listeners.tcp.default = 5672 management.tcp.port = 15672 # 重启服务 systemctl restart rabbitmq-server
创建专用管理账号(更安全)
生产环境或共享开发环境不建议开放guest账号,应该创建独立账号并授予管理员角色:
# 创建用户(用户名:admin,密码:admin123) rabbitmqctl add_user admin admin123 # 设置管理员角色 rabbitmqctl set_user_tags admin administrator # 设置访问权限(vhost为/,允许配置、写、读) rabbitmqctl set_permissions -p / admin "." "." "."
VMware NAT端口转发配置
在VMware中关闭虚拟机,打开“编辑虚拟机设置”→“网络适配器”→“NAT设置”→“添加端口转发”,将宿主机的5672和15672端口分别映射到虚拟机的对应端口,VirtualBox的方式类似,“网络”→“高级”→“端口转发”,添加两条规则:
- 名称:RabbitMQ通信,协议TCP,宿主机端口5672,子系统端口5672
- 名称:RabbitMQ管理,协议TCP,宿主机端口15672,子系统端口15672
配置完成后在宿主机浏览器访问 http://localhost:15672,用刚创建的admin账号登录。如果仍无法访问,优先检查虚拟机的监听地址
RabbitMQ默认监听所有网卡,不太可能是这个问题,但请确认没改过 listeners.tcp 配置。
Ubuntu虚拟机安装RabbitMQ的差异点
Ubuntu系统在虚拟机搭建RabbitMQ的操作与CentOS大同小异,差异主要在依赖安装命令上,以下命令在Ubuntu 22.04下验证过:
# 更新系统 apt update && apt upgrade -y # 安装Erlang(Ubuntu 22.04官方源Erlang版本较新,可直接安装) apt install -y erlang # 添加RabbitMQ官方仓库 curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | apt-key add - echo "deb https://dl.bintray.com/rabbitmq-erlang/debian focal erlang" >> /etc/apt/sources.list.d/rabbitmq.list echo "deb https://dl.bintray.com/rabbitmq/debian focal main" >> /etc/apt/sources.list.d/rabbitmq.list # 安装RabbitMQ apt install -y rabbitmq-server # 后续启用插件、创建账号等操作与CentOS完全一致
Ubuntu上的Erlang版本与RabbitMQ的兼容性问题比CentOS少得多,这也是为什么很多开发者更愿意在Ubuntu虚拟机里部署RabbitMQ做学习测试,但生产服务器僵局还是CentOS系偏多,选哪种取决于团队熟悉的运维体系。
Docker方式搭建RabbitMQ虚拟机的快捷路径
如果虚拟机里已经装了Docker,用容器方式搭建消息队列是最快的,几分钟就能搞定,而且不需要处理Erlang依赖,一条命令足够:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin123 rabbitmq:3.13-management
镜像名称里带 management 后缀的版本已经内置了Web管理插件,不需要再执行 rabbitmq-plugins enable,这种方式不仅适用于虚拟机,也适合在云服务器上快速部署,用Docker搭RabbitMQ的缺点是数据持久化需要额外配置volume挂载,容器删掉重建后数据就丢了,这对生产环境是致命的,但对于新手学习完全够用。
下表对比了三类虚拟机部署RabbitMQ方式的优缺点,帮你按场景决策:
| 安装方式 | 耗时 | 复杂度 | 数据持久化 | 适合场景 |
|---|---|---|---|---|
| yum/apt安装 | 15-20分钟 | 中等 | 原生持久化 | 开发环境、生产环境 |
| Docker容器 | 5分钟 | 低 | 需手动配置Volume | 快速验证、学习测试 |
| 二进制安装包 | 10分钟 | 高 | 原生持久化 | 对版本有特殊要求的场景 |
常见RabbitMQ启动失败排查
虚拟机环境下的RabbitMQ故障,九成集中在下面三个环节。
Erlang版本不匹配
RabbitMQ启动后立即退出,日志里报 Failed to start application rabbit 或 {error,{cannot_read_enabled_plugins_file,...}}
,多半是Erlang版本问题,执行 erl -version 查看当前版本,再去RabbitMQ官网对照版本兼容表,业内专家指出,绝大多数RabbitMQ的诡异报错,根源都是Erlang版本超出支持范围。
端口被占用
虚拟机里跑着其他Java程序时,有可能抢占了5672端口,用 ss -tlnp | grep 5672 看端口被谁占用,如果确实冲突,修改RabbitMQ监听端口即可:
# 在rabbitmq.conf中加入 listeners.tcp.default = 5673
主机名解析问题
RabbitMQ启动时依赖主机名的解析,如果你的虚拟机改了主机名,但 /etc/hosts 没同步,会导致启动时报 {error,{could_not_read_hostname,...}},解决方法:
# 设置固定主机名 hostnamectl set-hostname rabbitmq-node1 # 在/etc/hosts中加入 192.168.x.x rabbitmq-node1
虚拟机里搭建RabbitMQ的关键节点:环境准备阶段关掉防火墙和SELinux,安装阶段严格匹配Erlang版本,配置阶段处理guest账号限制和端口转发,这三步做到位,整个流程就不会出幺蛾子,熟悉了这套流程,不管换到云服务器还是物理机,原理都是相通的。
常见的RabbitMQ虚拟机搭建问题解答
虚拟机里安装RabbitMQ需要多大的内存配置?
给虚拟机分配2GB内存是最基础的数值。 RabbitMQ自身运行时大约占用300-500MB内存,但消息堆积后内存占用会快速上升,如果同时运行多个队列和消费者,建议给虚拟机分配到4GB内存,低于1GB内存的虚拟机跑RabbitMQ会比较吃力,频繁的GC会导致吞吐量明显波动,官方文档建议的内存阈值是物理内存的40%用于消息堆积,这个比例在虚拟机里同样适用。
用Docker方式在虚拟机搭建RabbitMQ和直接安装有什么区别?
最核心的区别在于数据持久化方式。 直接安装时数据默认写入 /var/lib/rabbitmq,只要不删系统文件数据就在;Docker方式如果没挂载volume,docker rm 容器后所有队列、消息、用户账号全部丢失,另一个差异是Docker容器内RabbitMQ的日志收集和排错比原生安装更麻烦,需要 docker logs 进入容器内部才能看到完整日志,如果是为了学习RabbitMQ的功能特性,Docker方式更轻量;如果是为了模拟生产环境,建议直接安装。
RabbitMQ的guest账号只能在本地登录,虚拟机里如何解决远程访问问题?
核心思路是创建新用户替代guest。 RabbitMQ出于安全考虑,默认禁止guest账号非localhost登录,这个限制无法通过简单配置绕过,标准做法是执行 rabbitmqctl add_user 创建新管理员账号,再配合 rabbitmqctl set_permissions 授权,改配置文件中的 loopback_users.guest = false 也有效,但会降低安全性,只建议在隔离的虚拟网络环境里这样做,生产环境务必创建独立账号并启用TLS通信。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/618761.html





