Deploy open-source RabbitMQ

更新时间:
复制 MD 格式

RabbitMQ is an open-source message broker that supports AMQP, MQTT, STOMP, and HTTP/WebSockets for reliable asynchronous messaging in distributed systems with high availability and fault tolerance. You can deploy RabbitMQ on an ECS instance by using manual installation, a Marketplace image, or Terraform.

Deploy RabbitMQ

  • Manual deployment: Install and configure RabbitMQ step by step. Requires basic Linux knowledge.

  • Quick deployment: Use a Marketplace image or Terraform to automate installation and reduce deployment time.

Manual deployment

The following steps apply to the latest RabbitMQ version. For other versions and methods, visit Installing RabbitMQ.

Prerequisites

Your ECS instance must meet the following requirements:

  • The instance has a public IP address or an Elastic IP Address (EIP).

  • Operating system: Ubuntu 20.04, Ubuntu 22.04, or Debian 11.0 to Debian 12.5.

    For all supported operating systems, visit Installing RabbitMQ.

  • Security group rules: Add inbound rules to the security group to allow traffic on ports 22, 80, and 15672.

    Note

    To connect to RabbitMQ with an MQ tool, also allow traffic on port 5672.

Procedure

  1. Connect to the instance where you will deploy RabbitMQ.

    Connect to a Linux instance by using Workbench.

  2. Install RabbitMQ.

    1. Install RabbitMQ dependencies.

      sudo apt-get install curl gnupg apt-transport-https -y
    2. Add the GPG public keys for RabbitMQ and Erlang to the system keyring.

      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. Add the RabbitMQ and Erlang APT repositories to /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. Update the local package index.

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

      sudo apt-get install rabbitmq-server -y --fix-missing
  3. Configure RabbitMQ.

    1. Enable and start the RabbitMQ service.

      sudo systemctl enable rabbitmq-server
      sudo systemctl start rabbitmq-server
    2. Delete the default user for security.

      The default username and password for RabbitMQ are both guest.

      sudo rabbitmqctl delete_user guest
    3. Create a RabbitMQ administrator.

      1. Create a user.

        sudo rabbitmqctl add_user <username> <password>

        Replace <username> and <password> with your credentials.

      2. Assign the administrator tag to the user.

        sudo rabbitmqctl set_user_tags <username> administrator
      3. Grant all permissions to the user.

        sudo rabbitmqctl set_permissions -p / <username> ".*" ".*" ".*"
  4. Enable the RabbitMQ management plugin.

    sudo rabbitmq-plugins enable rabbitmq_management

Quick deployment

Marketplace image

A Marketplace image automates installation and configuration. Image pricing is listed on the product details page.

  1. Click Open-source message queue middleware RabbitMQ or to go to the image details page.

    The image details page provides image specifications and deployment instructions.

  2. Click Immediately Buy or .

  3. On the Custom Launch page, configure the parameters and purchase the ECS instance as prompted.

    Set the following key parameters. All parameters are described in Create an instance on the Custom Launch tab.

    • Image: The Image section is already set to the image that you purchased.

    • Public IP: Select Assign Public IPv4 Address.

    • Security Group: Allow inbound traffic on ports 22, 80, and 15672.

  4. Retrieve the RabbitMQ credentials.

    1. Connect to the RabbitMQ server.

      Connect to a Linux instance by using Workbench.

    2. Run the following command to retrieve the RabbitMQ credentials.

      sudo cat /credentials/password.txt

      Example output:

      • rabbitmq_user: Username.

      • rabbitmq_password: Password.

      • rabbitmq_gui_port: Web management port.

      • rabbitmq_mq_port: Remote connection port.

      • rabbitmq_er_port: Erlang inter-process communication port.

      • rabbitmq_mqtt_port: MQTT service port.

      root@iZuf660jbfxxx:~# sudo cat /credentials/password.txt
      ======== credentials for rabbitmq ========
      rabbitmq_user: admin
      rabbitmq_password: OOhWmVE9xxx
      rabbitmq_gui_port: 15672
      rabbitmq_mq_port: 5672
      rabbitmq_er_port: 4369
      rabbitmq_mqtt_port: 1833

Terraform

Terraform is an Infrastructure as Code (IaC) tool that automates cloud resource provisioning through declarative configuration files.

Procedure

  1. Click Run with one click or to open Terraform Explorer and automatically load the Terraform code.

    Click to view the complete Terraform code

    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 = "The password of the instance. The password must be 8 to 30 characters in length and contain at least three of the following character types: uppercase letters, lowercase letters, digits, and special characters (`~!@#$%^&*_-+=|{}[]:;'<>?,./)."
      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"
    }
    # Query available zones that meet the specified conditions.
    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. Modify the parameters as needed. By default, one VPC, one vSwitch, one security group, and one pay-as-you-go ECS instance are created in the cn-beijing region. ECS instance pricing is described in Billing overview.

  3. Click Initiate Debugging to preview resources. If correct, click Plan & Apply to deploy.

Log in to the RabbitMQ console

  1. In the address bar of your browser, enter http://<your_instance_public_ip>:15672.

    On the RabbitMQ Management login page, enter your credentials and click Login.

  2. After you click Login, the RabbitMQ management interface opens.

    The Overview tab displays RabbitMQ and Erlang versions, node resource usage, and connection and queue statistics, confirming that RabbitMQ is running correctly.

Migrate open-source RabbitMQ to the cloud

To resolve stability issues such as message backlogs and split-brain problems, and to gain high concurrency and elastic scaling, migrate your self-managed RabbitMQ cluster to ApsaraMQ for RabbitMQ. Migrate open-source RabbitMQ to the cloud.