强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

RabbitMQ 消息队列完全教程 / 第 2 章:安装与部署

第 2 章:安装与部署

本章介绍 RabbitMQ 的多种安装方式、初始配置以及管理界面设置,帮助你快速搭建可用的消息队列环境。


2.1 安装方式概览

安装方式适用场景优点缺点
Docker开发/测试/快速验证秒级启动、环境隔离性能略低
系统包管理生产单节点集成系统服务版本可能滞后
官方 APT/YUM 仓库生产环境官方维护、及时更新需配置仓库
二进制安装定制化部署完全控制手动管理依赖
Kubernetes Operator云原生生产环境自动化运维学习成本高

2.2 Docker 快速部署(推荐入门)

单节点部署

# 拉取官方镜像(含管理插件)
docker pull rabbitmq:4-management

# 启动容器
docker run -d \
  --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=admin123 \
  -v rabbitmq_data:/var/lib/rabbitmq \
  rabbitmq:4-management
端口协议用途
5672AMQP消息通信端口
15672HTTP管理界面 Web UI
25672Erlang集群内部通信
1883MQTTMQTT 协议端口(需启用插件)

常用环境变量

变量说明默认值
RABBITMQ_DEFAULT_USER默认用户名guest
RABBITMQ_DEFAULT_PASS默认密码guest
RABBITMQ_DEFAULT_VHOST默认虚拟主机/
RABBITMQ_ERLANG_COOKIE集群认证 Cookie随机生成
RABBITMQ_LOG_LEVEL日志级别info

验证安装

# 检查容器状态
docker ps --filter name=rabbitmq

# 查看日志
docker logs rabbitmq --tail 50

# 验证管理界面
curl -u admin:admin123 http://localhost:15672/api/overview

# 使用 rabbitmqctl 检查
docker exec rabbitmq rabbitmqctl status
docker exec rabbitmq rabbitmqctl list_queues

2.3 Ubuntu/Debian 系统安装

添加官方仓库

# 安装依赖
sudo apt-get update
sudo apt-get install -y curl gnupg apt-transport-https

# 添加 RabbitMQ 签名密钥
curl -1sLf 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc' | sudo gpg --dearmor -o /usr/share/keyrings/com.rabbitmq.team.gpg

# 添加 Erlang 仓库
curl -1sLf 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key' | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg

# 添加仓库源
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list

echo "deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main" | sudo tee -a /etc/apt/sources.list.d/rabbitmq.list

安装 RabbitMQ

sudo apt-get update
sudo apt-get install -y rabbitmq-server

# 启动服务
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

# 查看状态
sudo systemctl status rabbitmq-server
sudo rabbitmqctl status

2.4 CentOS/RHEL 安装

# 安装依赖
sudo yum install -y epel-release
sudo yum install -y socat logrotate

# 导入签名密钥
sudo rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc'

# 添加仓库
cat << 'EOF' | sudo tee /etc/yum.repos.d/rabbitmq.repo
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/rpm/el/8/$basearch
gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc

[rabbitmq_server]
name=rabbitmq_server
baseurl=https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/rpm/el/8/$basearch
gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
EOF

sudo yum install -y rabbitmq-server
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

2.5 管理插件配置

启用管理插件

# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management

# 验证插件状态
sudo rabbitmq-plugins list

# 重启服务使插件生效
sudo systemctl restart rabbitmq-server

常用插件

插件名说明命令
rabbitmq_managementWeb 管理界面rabbitmq-plugins enable rabbitmq_management
rabbitmq_shovel消息转发rabbitmq-plugins enable rabbitmq_shovel
rabbitmq_shovel_managementShovel 管理界面rabbitmq-plugins enable rabbitmq_shovel_management
rabbitmq_federation联邦队列rabbitmq-plugins enable rabbitmq_federation
rabbitmq_delayed_message_exchange延迟消息手动安装 .ez 文件
rabbitmq_prometheusPrometheus 监控rabbitmq-plugins enable rabbitmq_prometheus
rabbitmq_mqttMQTT 协议支持rabbitmq-plugins enable rabbitmq_mqtt
rabbitmq_stompSTOMP 协议支持rabbitmq-plugins enable rabbitmq_stomp

2.6 用户管理

使用 rabbitmqctl 管理用户

# 添加用户
sudo rabbitmqctl add_user myuser mypassword

# 设置用户角色
sudo rabbitmqctl set_user_tags myuser administrator

# 设置用户权限(VHost / 配置权限 / 写权限 / 读权限)
sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

# 查看所有用户
sudo rabbitmqctl list_users

# 查看用户权限
sudo rabbitmqctl list_permissions

# 修改密码
sudo rabbitmqctl change_password myuser newpassword

# 删除用户
sudo rabbitmqctl delete_user guest

# 清除用户权限
sudo rabbitmqctl clear_permissions -p / myuser

用户角色说明

角色权限范围
(none)无法访问管理界面
management查看自己 VHost 的队列/交换机/连接,管理自己的策略
policymakermanagement 权限 + 管理策略和参数
monitoring查看所有连接和通道,查看节点相关数据
administrator所有权限:创建删除 VHost、用户、集群管理

使用 HTTP API 管理用户

# 添加用户
curl -u admin:admin123 -X PUT http://localhost:15672/api/users/myuser \
  -H "Content-Type: application/json" \
  -d '{"password":"mypassword","tags":"administrator"}'

# 设置权限
curl -u admin:admin123 -X PUT http://localhost:15672/api/permissions/%2F/myuser \
  -H "Content-Type: application/json" \
  -d '{"configure":".*","write":".*","read":".*"}'

2.7 Virtual Host 配置

Virtual Host(VHost)是 RabbitMQ 中的逻辑隔离单元,类似数据库中的 schema。

# 创建 VHost
sudo rabbitmqctl add_vhost production

# 查看所有 VHost
sudo rabbitmqctl list_vhosts

# 设置用户权限
sudo rabbitmqctl set_permissions -p production myuser ".*" ".*" ".*"

# 删除 VHost
sudo rabbitmqctl delete_vhost production

VHost 使用建议

场景VHost 策略
开发/测试/生产环境隔离每个环境一个 VHost
多租户系统每个租户一个 VHost
微服务隔离每组服务一个 VHost
单体应用默认 / 即可

2.8 初始配置(rabbitmq.conf)

配置文件路径:

系统配置文件路径
Linux/etc/rabbitmq/rabbitmq.conf
Docker/etc/rabbitmq/rabbitmq.conf(挂载卷)
macOS (Homebrew)$(brew --prefix)/etc/rabbitmq/rabbitmq.conf

推荐的初始配置

# /etc/rabbitmq/rabbitmq.conf

# === 网络配置 ===
# 监听端口
listeners.tcp.default = 5672
# 管理界面端口
management.tcp.port = 15672

# === 内存限制 ===
# 内存阈值(系统内存的 60%)
vm_memory_high_watermark.relative = 0.6
# 内存告警后的消息发布策略
vm_memory_high_watermark_paging_ratio = 0.75

# === 磁盘限制 ===
# 磁盘空闲空间阈值
disk_free_limit.absolute = 2GB

# === 连接配置 ===
# 最大连接数
# channel_max = 2048
# 心跳超时(秒)
heartbeat = 60

# === 日志配置 ===
log.file.level = info
log.dir = /var/log/rabbitmq

# === 安全配置 ===
# 禁用默认 guest 用户远程登录
loopback_users.guest = true

# === 队列默认配置 ===
# 默认队列类型(quorum 或 classic)
# default_queue_type = quorum

advanced.config(高级配置)

%% /etc/rabbitmq/advanced.config
[
  {rabbit, [
    {tcp_listen_options, [
      {backlog, 128},
      {nodelay, true},
      {exit_on_close, false},
      {sndbuf, 196608},
      {recbuf, 196608}
    ]},
    {collect_statistics_interval, 5000},
    {queue_index_embed_msgs_below, 4096}
  ]}
].

2.9 集群快速搭建

Docker Compose 快速集群

# docker-compose.yml
version: '3.8'

services:
  rabbitmq1:
    image: rabbitmq:4-management
    container_name: rabbitmq1
    hostname: rabbitmq1
    environment:
      RABBITMQ_ERLANG_COOKIE: "my_secret_cookie"
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin123
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - rabbitmq1_data:/var/lib/rabbitmq

  rabbitmq2:
    image: rabbitmq:4-management
    container_name: rabbitmq2
    hostname: rabbitmq2
    environment:
      RABBITMQ_ERLANG_COOKIE: "my_secret_cookie"
    ports:
      - "5673:5672"
      - "15673:15672"
    volumes:
      - rabbitmq2_data:/var/lib/rabbitmq

  rabbitmq3:
    image: rabbitmq:4-management
    container_name: rabbitmq3
    hostname: rabbitmq3
    environment:
      RABBITMQ_ERLANG_COOKIE: "my_secret_cookie"
    ports:
      - "5674:5672"
      - "15674:15672"
    volumes:
      - rabbitmq3_data:/var/lib/rabbitmq

volumes:
  rabbitmq1_data:
  rabbitmq2_data:
  rabbitmq3_data:

组建集群

# 启动集群
docker-compose up -d

# 将 rabbitmq2 加入集群
docker exec rabbitmq2 rabbitmqctl stop_app
docker exec rabbitmq2 rabbitmqctl reset
docker exec rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1
docker exec rabbitmq2 rabbitmqctl start_app

# 将 rabbitmq3 加入集群
docker exec rabbitmq3 rabbitmqctl stop_app
docker exec rabbitmq3 rabbitmqctl reset
docker exec rabbitmq3 rabbitmqctl join_cluster rabbit@rabbitmq1
docker exec rabbitmq3 rabbitmqctl start_app

# 验证集群状态
docker exec rabbitmq1 rabbitmqctl cluster_status

设置镜像策略(3.x)

# 所有队列在所有节点上镜像
docker exec rabbitmq1 rabbitmqctl set_policy ha-all \
  '.*' '{"ha-mode":"all","ha-sync-mode":"automatic"}' \
  --apply-to queues

2.10 安装验证清单

完成安装后,使用以下清单进行验证:

序号检查项命令预期结果
1服务状态rabbitmqctl status返回完整状态信息
2管理界面浏览器访问 http://localhost:15672登录页面正常
3端口监听ss -tlnp | grep 5672端口已监听
4发送测试消息rabbitmqadmin publish exchange=amq.default routing_key=test payload="hello"消息发送成功
5消费测试消息rabbitmqadmin get queue=test ackmode=ack_requeue_true消息获取成功
6日志检查cat /var/log/rabbitmq/[email protected]无 ERROR

2.11 注意事项

⚠️ 生产环境必须修改默认密码

默认 guest/guest 仅允许 localhost 访问。生产环境应立即创建新管理员并删除或锁定 guest 账户。

⚠️ 防火墙配置

# 仅开放必要端口
5672  - AMQP(应用连接)
15672 - 管理界面(建议限制 IP 访问)
25672 - 集群内部通信(仅集群节点之间)

⚠️ Erlang Cookie 一致性

集群中所有节点的 .erlang.cookie 文件内容必须完全一致(包括内容和文件权限)。

# Cookie 文件权限
chmod 400 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

⚠️ Docker 生产注意事项

不要使用默认 bridge 网络组建集群,使用自定义网络或 --net=host 模式。


2.12 扩展阅读


下一章: 第 3 章:核心架构 — 深入理解 RabbitMQ 的内部组件和消息流转机制。