深色模式
RabbitMQ 部署
摘要:RabbitMQ 以 exchange-queue-binding 模型提供可靠的异步消息投递。本文先完成单节点安装与管理插件启用,再配置集群与镜像/仲裁队列,最后给出用户权限与收发验证命令。
适用环境
bash
cat /etc/os-release | grep -E '^(ID|VERSION_ID)='
hostname # 集群节点的主机名,erlang cookie 依赖它
free -g # 建议 >= 2G
# RabbitMQ 依赖 Erlang,版本对应关系务必到官方文档核对
# https://www.rabbitmq.com/docs/which-erlang1
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 安装 Erlang 与 RabbitMQ
bash
# Debian/Ubuntu(官方 Cloudsmith 仓库,请以官方文档为准)
sudo apt-get update
sudo apt-get install -y erlang-base erlang-asn1 erlang-crypto \
erlang-eldap erlang-ftp erlang-inets erlang-mnesia \
erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
sudo apt-get install -y rabbitmq-server
# RHEL/Rocky:可用官方 packagecloud 仓库或 rpm 包安装1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
2. 启动并开启管理插件
bash
sudo systemctl enable --now rabbitmq-server
sudo rabbitmq-plugins enable rabbitmq_management
sudo ss -ltnp | grep -E '5672|15672' # 5672 AMQP,15672 管理界面1
2
3
2
3
3. 创建用户与权限
bash
# 删除默认 guest/guest(默认只允许 localhost 登录)
sudo rabbitmqctl delete_user guest 2>/dev/null || true
sudo rabbitmqctl add_user appuser 'StrongPass!2026'
sudo rabbitmqctl set_user_tags appuser management
sudo rabbitmqctl add_vhost /prod
sudo rabbitmqctl set_permissions -p /prod appuser ".*" ".*" ".*"
sudo rabbitmqctl list_users1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
DANGER
默认账号 guest/guest 是公开的默认值,生产环境必须删除或改密码。管理端口 15672 绝不能直接暴露到公网。
4. 搭建集群(所有节点 cookie 必须一致)
bash
# 在节点 2、3 上执行(先停应用再 join)
sudo systemctl stop rabbitmq-server
sudo scp node1:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo systemctl start rabbitmq-server
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@node1
sudo rabbitmqctl start_app
sudo rabbitmqctl cluster_status1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
5. 配置镜像队列 / 仲裁队列
bash
# 方式 A:经典镜像队列(policy 匹配 ha. 开头的队列,镜像到全部节点)
sudo rabbitmqctl set_policy ha-all "^ha\." \
'{"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to queues
# 方式 B:仲裁队列(推荐,基于 Raft,声明时指定类型)1
2
3
4
5
2
3
4
5
yaml
# 仲裁队列声明思路(以客户端参数为准,非配置文件)
# queue.declare 时传 arguments: {"x-queue-type": "quorum"}1
2
2
6. 验证收发
bash
# 用管理 API 发一条消息
curl -u appuser:'StrongPass!2026' -H 'content-type: application/json' \
-X POST http://127.0.0.1:15672/api/exchanges/%2Fprod/amq.default/publish \
-d '{"properties":{},"routing_key":"ha.demo","payload":"hello","payload_encoding":"string"}'
# 用 CLI 消费
sudo rabbitmqadmin get queue=ha.demo ackmode=ack_requeue_false count=11
2
3
4
5
6
7
2
3
4
5
6
7
验证
bash
sudo rabbitmqctl status | head -20
sudo rabbitmqctl cluster_status
sudo rabbitmqctl list_queues name durable policy messages
curl -s -u appuser:'StrongPass!2026' http://127.0.0.1:15672/api/overview | head -c 300
# 浏览器打开 http://<IP>:15672 能看到管理界面即成功1
2
3
4
5
2
3
4
5
常见坑
WARNING
集群节点的 /var/lib/rabbitmq/.erlang.cookie 内容必须完全一致,权限必须是 400 且属主 rabbitmq,否则 join 时报 cookie 不匹配。
WARNING
节点名依赖主机名解析。若 /etc/hosts 没有互相解析,join_cluster rabbit@node1 会失败,需先补齐 hosts 条目。
DANGER
磁盘空间低于水位(disk_free_limit,默认约 50MB)时 RabbitMQ 会阻塞所有生产者,表现为消息发不进去。生产环境请调整该阈值并监控磁盘使用率。