全部產品
Search
文件中心

Elastic Compute Service:部署開源的RabbitMQ

更新時間:Mar 13, 2025

RabbitMQ是一款開源訊息佇列系統,支援多種協議(AMQP、MQTT、STOMP、HTTP/WebSockets),具有良好的易用性、擴充性和高可用性。主要用於在分布式系統中協調和管理通訊,通過非同步訊息傳遞提高系統的解耦性、伸縮性、並發處理能力和容錯性。其穩定的效能、豐富的功能集以及活躍的社區支援,廣泛應用於企業級應用的訊息傳遞和任務處理。本文介紹如何在Elastic Compute Service中部署開源的RabbitMQ。

部署RabbitMQ

  • 手動部署:適合對Linux命令有基本瞭解的使用者,能夠自訂部署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連接埠。

操作步驟

  1. 遠端連線需要部署RabbitMQ的執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 安裝RabbitMQ。

    1. 安裝RabbitMQ基本依賴。

      sudo apt-get install curl gnupg apt-transport-https -y
    2. 下載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
    3. 將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
    4. 更新本地的包索引。

      sudo apt-get update -y
    5. 安裝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
    6. 安裝RabbitMQ。

      sudo apt-get install rabbitmq-server -y --fix-missing
  3. 配置RabbitMQ。

    1. 設定RabbitMQ開機自啟動並啟動RabbitMQ。

      sudo systemctl enable rabbitmq-server
      sudo systemctl start rabbitmq-server
    2. 為保證資料安全,建議您運行以下命令,刪除預設使用者。

      RabbitMQ預設的帳號使用者名稱和密碼都是guest

      sudo rabbitmqctl delete_user guest
    3. 建立RabbitMQ管理使用者。

      1. 建立一個新使用者。

        sudo rabbitmqctl add_user <使用者名稱> <密碼>

        其中,<使用者名稱><密碼>為您自訂的資訊。

      2. 將建立的新使用者佈建為管理員。

        sudo rabbitmqctl set_user_tags <使用者名稱> administrator
      3. 賦予新建立的使用者所有許可權。

        sudo rabbitmqctl set_permissions -p / <使用者名稱> ".*" ".*" ".*"
  4. 啟動RabbitMQ的Web管理介面。

    sudo rabbitmq-plugins enable rabbitmq_management

快速部署

使用雲市場鏡像快速部署

通過雲市場鏡像快速部署,省去了安裝配置RabbitMQ的過程,大大節省了部署時間。所使用的雲市場鏡像是否收費,以雲市場鏡像介面為準。

  1. 單擊Cloud Native MQ for Apache RabbitMQ進入鏡像詳情頁。

    您可以在鏡像詳情頁擷取鏡像資訊以及使用指南。

  2. 單擊Choose Your Plan

  3. 自訂購買頁,根據頁面提示,完成配置項併購買ECS執行個體。

    配置時請注意以下參數,其他配置可以按需選擇。更多參數說明,請參見自訂購買執行個體

    • 鏡像鏡像地區已設定為您購買的鏡像。

    • 公網 IP:選中分配公網 IPv4 地址

    • 安全性群組:安全性群組規則應允許存取22、80、15672。

  4. 擷取RabbitMQ的使用者名稱和登入密碼。

    1. 遠端連線RabbitMQ伺服器。

      具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

    2. 執行以下命令,擷取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協議服務的監聽連接埠

      image

使用Terraform快速部署

Terraform是一款IaC工具(Infrastructure as Code),能夠協助開發人員和營運團隊自動化基礎設施的建立、部署和管理。您可以通過編寫簡潔的代碼來定義和配置雲端基礎設施,而不必手動操作和配置。

操作步驟

  1. 點擊一鍵運行進入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)
    }
  2. 根據實際情況修改參數,預設情況下,將會在cn-beijing建立1個VPC、1個交換器、1個安全性群組、1台隨用隨付ECS執行個體。關於ECS執行個體的計費說明,請參見計費概述

  3. 單擊發起調試,預覽待建立資來源詳細資料,若資源資訊無誤,單擊預覽並執行開始建立資源。當任務的執行詳情狀態為執行成功時,說明已部署完成。

登入RabbitMQ管理介面

  1. 在本地瀏覽器中,輸入http://<Linux執行個體的公網IP>:15672

    顯示如下頁面,說明RabbitMQ安裝成功。RabbitMQ登入頁

  2. 輸入已建立的RabbitMQ管理使用者名和密碼後,單擊Login,進入RabbitMQ管理介面。

    RabbitMQ管理介面展示資訊如下所示:RabbitMQ首頁

開源RabbitMQ遷移上雲

如果您希望解決RabbitMQ叢集各種穩定性痛點(例如訊息堆積、腦裂等問題)、並實現高並發、分布式、靈活擴縮容時,您可以將開源RabbitMQ叢集遷移至雲訊息佇列 RabbitMQ 版,具體操作,請參見開源RabbitMQ遷移上雲