第 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
| 端口 | 协议 | 用途 |
|---|---|---|
| 5672 | AMQP | 消息通信端口 |
| 15672 | HTTP | 管理界面 Web UI |
| 25672 | Erlang | 集群内部通信 |
| 1883 | MQTT | MQTT 协议端口(需启用插件) |
常用环境变量
| 变量 | 说明 | 默认值 |
|---|---|---|
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_management | Web 管理界面 | rabbitmq-plugins enable rabbitmq_management |
rabbitmq_shovel | 消息转发 | rabbitmq-plugins enable rabbitmq_shovel |
rabbitmq_shovel_management | Shovel 管理界面 | rabbitmq-plugins enable rabbitmq_shovel_management |
rabbitmq_federation | 联邦队列 | rabbitmq-plugins enable rabbitmq_federation |
rabbitmq_delayed_message_exchange | 延迟消息 | 手动安装 .ez 文件 |
rabbitmq_prometheus | Prometheus 监控 | rabbitmq-plugins enable rabbitmq_prometheus |
rabbitmq_mqtt | MQTT 协议支持 | rabbitmq-plugins enable rabbitmq_mqtt |
rabbitmq_stomp | STOMP 协议支持 | 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 的队列/交换机/连接,管理自己的策略 |
| policymaker | management 权限 + 管理策略和参数 |
| 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 的内部组件和消息流转机制。