RabbitMQ是一款開源訊息佇列系統,支援多種協議(AMQP、MQTT、STOMP、HTTP/WebSockets),具有良好的易用性、擴充性和高可用性。主要用於在分布式系統中協調和管理通訊,通過非同步訊息傳遞提高系統的解耦性、伸縮性、並發處理能力和容錯性。其穩定的效能、豐富的功能集以及活躍的社區支援,廣泛應用於企業級應用的訊息傳遞和任務處理。本文介紹如何在Elastic Compute Service中部署開源的RabbitMQ。
部署RabbitMQ
手動部署
本操作以安裝最新版RabbitMQ為例進行說明,更多版本及安裝方式,請參見Installing RabbitMQ。
前提條件
手動部署RabbitMQ時,請確保已建立ECS執行個體,並滿足以下條件:
執行個體已指派公網IP地址或綁定Elastic IP Address(EIP)。具體操作,請參見Elastic IP Address。
作業系統:Ubuntu 20.04、Ubuntu 22.04、Debian 11.0~Debian 12.5。
更多支援的系統及安裝方式,請參見Installing RabbitMQ。
安全性群組規則:安全性群組規則入方向需允許存取22、80、15672連接埠。
說明 如果需要通過MQ工具串連RabbitMQ伺服器,還需允許存取5672連接埠。
操作步驟
遠端連線需要部署RabbitMQ的執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
安裝RabbitMQ。
安裝RabbitMQ基本依賴。
sudo apt-get install curl gnupg apt-transport-https -y
下載RabbitMQ和Erlang的GPG公開金鑰,並將公開金鑰資訊添加到系統的信任密鑰環中。
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
將RabbitMQ和Erlang的官方APT倉庫添加到/etc/apt/sources.list.d/rabbitmq.list檔案中。
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
EOF
更新本地的包索引。
安裝Erlang相關的各種包。
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
安裝RabbitMQ。
sudo apt-get install rabbitmq-server -y --fix-missing
配置RabbitMQ。
設定RabbitMQ開機自啟動並啟動RabbitMQ。
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
為保證資料安全,建議您運行以下命令,刪除預設使用者。
RabbitMQ預設的帳號使用者名稱和密碼都是guest。
sudo rabbitmqctl delete_user guest
建立RabbitMQ管理使用者。
建立一個新使用者。
sudo rabbitmqctl add_user <使用者名稱> <密碼>
其中,<使用者名稱>和<密碼>為您自訂的資訊。
將建立的新使用者佈建為管理員。
sudo rabbitmqctl set_user_tags <使用者名稱> administrator
賦予新建立的使用者所有許可權。
sudo rabbitmqctl set_permissions -p / <使用者名稱> ".*" ".*" ".*"
啟動RabbitMQ的Web管理介面。
sudo rabbitmq-plugins enable rabbitmq_management
快速部署
使用雲市場鏡像快速部署
通過雲市場鏡像快速部署,省去了安裝配置RabbitMQ的過程,大大節省了部署時間。所使用的雲市場鏡像是否收費,以雲市場鏡像介面為準。
單擊Cloud Native MQ for Apache RabbitMQ進入鏡像詳情頁。
您可以在鏡像詳情頁擷取鏡像資訊以及使用指南。
單擊Choose Your Plan。
在自訂購買頁,根據頁面提示,完成配置項併購買ECS執行個體。
配置時請注意以下參數,其他配置可以按需選擇。更多參數說明,請參見自訂購買執行個體。
擷取RabbitMQ的使用者名稱和登入密碼。
遠端連線RabbitMQ伺服器。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
執行以下命令,擷取RabbitMQ的使用者名稱和登入密碼。
sudo cat /credentials/password.txt
回顯資訊類似如下所示。
rabbitmq_user:RabbitMQ使用者名稱
rabbitmq_password:RabbitMQ登入密碼
rabbitmq_gui_port:RabbitMQ Web伺服器連接埠
rabbitmq_mq_port:RabbitMQ遠端連線連接埠
rabbitmq_er_port:RabbitMQ伺服器用於Erlang處理序間通訊的內部連接埠
rabbitmq_mqtt_port:RabbitMQ伺服器對外提供MQTT協議服務的監聽連接埠

使用Terraform快速部署
Terraform是一款IaC工具(Infrastructure as Code),能夠協助開發人員和營運團隊自動化基礎設施的建立、部署和管理。您可以通過編寫簡潔的代碼來定義和配置雲端基礎設施,而不必手動操作和配置。
操作步驟
點擊一鍵運行進入Terraform Explorer,自動載入如下的Terraform代碼。
單擊查看完整Terraform代碼
provider "alicloud" {
region = var.region
}
variable "region" {
default = "cn-beijing"
}
variable "common_name" {
description = "Common name for resources."
type = string
default = "deploy_rabbitmq_by_tf"
}
variable "system_disk_category" {
default = "cloud_essd"
description = "The category of the system disk."
}
variable "instance_password" {
description = "Server login password, length 8-30, must contain three (Capital letters, lowercase letters, numbers, `~!@#$%^&*_-+=|{}[]:;'<>?,./ Special symbol in)"
type = string
default = "Test@123456"
}
variable "image_id" {
description = "Image of instance. Supported only on Ubuntu."
type = string
default = "ubuntu_22_04_x64_20G_alibase_20241224.vhd"
}
variable "instance_type" {
description = "Instance type."
type = string
default = "ecs.e-c1m2.large"
}
variable "access_ip" {
description = "The IP address you used to access the ECS."
type = string
default = "0.0.0.0/0"
}
variable "rabbitmq_user_name" {
description = "Create a new user for RabbitMQ."
type = string
default = "rabbitmq@new_user"
}
variable "rabbitmq_user_password" {
description = "Password for a new RabbitMQ user."
type = string
default = "rabbitmq@pw12345"
}
# 查詢滿足條件的可用性區域
data "alicloud_zones" "default" {
available_disk_category = var.system_disk_category
available_resource_creation = "VSwitch"
available_instance_type = var.instance_type
}
resource "alicloud_vpc" "rabbitmq_vpc" {
vpc_name = "${var.common_name}-vpc"
cidr_block = "192.168.0.0/16"
}
resource "alicloud_vswitch" "rabbitmq_vsw" {
vpc_id = alicloud_vpc.rabbitmq_vpc.id
vswitch_name = "${var.common_name}-vsw"
cidr_block = "192.168.0.0/24"
zone_id = data.alicloud_zones.default.zones.0.id
}
resource "alicloud_security_group" "rabbitmq_sg" {
security_group_name = "${var.common_name}-sg"
vpc_id = alicloud_vpc.rabbitmq_vpc.id
}
resource "alicloud_security_group_rule" "allow_tcp_22" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = alicloud_security_group.rabbitmq_sg.id
cidr_ip = var.access_ip
}
resource "alicloud_security_group_rule" "allow_tcp_80" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "80/80"
priority = 1
security_group_id = alicloud_security_group.rabbitmq_sg.id
cidr_ip = var.access_ip
}
resource "alicloud_security_group_rule" "allow_tcp_15672" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "15672/15672"
priority = 1
security_group_id = alicloud_security_group.rabbitmq_sg.id
cidr_ip = var.access_ip
}
resource "alicloud_security_group_rule" "allow_icmp_all" {
type = "ingress"
ip_protocol = "icmp"
nic_type = "intranet"
policy = "accept"
port_range = "-1/-1"
priority = 1
security_group_id = alicloud_security_group.rabbitmq_sg.id
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_instance" "rabbitmq_ecs" {
availability_zone = data.alicloud_zones.default.zones.0.id
security_groups = [alicloud_security_group.rabbitmq_sg.id]
instance_type = var.instance_type
system_disk_category = var.system_disk_category
image_id = var.image_id
instance_name = "${var.common_name}-ecs"
vswitch_id = alicloud_vswitch.rabbitmq_vsw.id
internet_max_bandwidth_out = 10
password = var.instance_password
}
locals {
command_content = <<SHELL
#!/bin/sh
sudo apt-get install curl gnupg apt-transport-https -y
## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
## Provides RabbitMQ
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
EOF
## Update package indices
sudo apt-get update -y
## Install Erlang packages
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
## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_user ${var.rabbitmq_user_name} ${var.rabbitmq_user_password}
sudo rabbitmqctl set_user_tags ${var.rabbitmq_user_name} administrator
sudo rabbitmqctl set_permissions -p / ${var.rabbitmq_user_name} ".*" ".*" ".*"
sudo rabbitmq-plugins enable rabbitmq_management
SHELL
}
resource "alicloud_ecs_command" "deploy_rabbitmq" {
name = "DeploydRabbitMQ"
type = "RunShellScript"
command_content = base64encode(local.command_content)
timeout = 3600
working_dir = "/root"
}
resource "alicloud_ecs_invocation" "invocation" {
instance_id = [alicloud_instance.rabbitmq_ecs.id]
command_id = alicloud_ecs_command.deploy_rabbitmq.id
timeouts {
create = "5m"
}
}
output "rabbitmq-login_url" {
value = format("http://%s:15672", alicloud_instance.rabbitmq_ecs.public_ip)
}
根據實際情況修改參數,預設情況下,將會在cn-beijing建立1個VPC、1個交換器、1個安全性群組、1台隨用隨付ECS執行個體。關於ECS執行個體的計費說明,請參見計費概述。
單擊發起調試,預覽待建立資來源詳細資料,若資源資訊無誤,單擊預覽並執行開始建立資源。當任務的執行詳情狀態為執行成功時,說明已部署完成。
登入RabbitMQ管理介面
在本地瀏覽器中,輸入http://<Linux執行個體的公網IP>:15672。
顯示如下頁面,說明RabbitMQ安裝成功。
輸入已建立的RabbitMQ管理使用者名和密碼後,單擊Login,進入RabbitMQ管理介面。
RabbitMQ管理介面展示資訊如下所示:
開源RabbitMQ遷移上雲
如果您希望解決RabbitMQ叢集各種穩定性痛點(例如訊息堆積、腦裂等問題)、並實現高並發、分布式、靈活擴縮容時,您可以將開源RabbitMQ叢集遷移至雲訊息佇列 RabbitMQ 版,具體操作,請參見開源RabbitMQ遷移上雲。