Prerequisites

  • 3 Virtual Machines or servers (Using Ubuntu 24.04 LTS here). (Server 1, 2, 3)
  • These three servers must have network connectivity with each other.

Getting Started 🚀

Install RabbitMQ and dependencies

Run on all 3 servers

# Install offical source
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/setup.deb.sh' | sudo -E bash
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/setup.deb.sh' | sudo -E bash

# Install dependencies
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
apt-get install -y rabbitmq-server

Secure config

Run on all 3 servers

# Enable Web management panel
rabbitmq-plugins enable rabbitmq_management
# Auto start
systemctl enable rabbitmq-server
# Start service
systemctl start rabbitmq-server
# Add new user
rabbitmqctl add_user sysadmin HereIsYourPassword!
# Set sysadmin user to administrator
rabbitmqctl set_user_tags sysadmin administrator
# Grant admin permission
rabbitmqctl set_permissions -p / sysadmin ".*" ".*" ".*"
# Remove guest user
rabbitmqctl delete_user guest

Configure cluster

Run on Server 1

RabbitMQ nodes use a shared secret called the Erlang cookie to authenticate with one another.

# Lookup cookie
# If cookie is 'EMfN8Tr+ba26advDujhJuL7gfvC7yvjRwhiK1scQwWa9SU2HTo88VP5q'
cat /var/lib/rabbitmq/.erlang.cookie

Join node to cluster

Run on Server 2 and Server 3

/etc/hosts must to contain other server hostname mapping, for example:

192.168.100.140 mq-node-01
192.168.100.141 mq-node-02
192.168.100.142 mq-node-03
systemctl stop rabbitmq-server
# Write RabbitMQ's(Server 1) cookie value
echo 'EMfN8Tr+ba26advDujhJuL7gfvC7yvjRwhiK1scQwWa9SU2HTo88VP5q' > /var/lib/rabbitmq/.erlang.cookie
systemctl start rabbitmq-server
rabbitmqctl stop_app
rabbitmqctl reset
# Join cluster, 'mq-node-01' is server 1's hostname
rabbitmqctl join_cluster rabbit@mq-node-01
rabbitmqctl start_app

Get cluster status

rabbitmqctl cluster_status

Connect to RabbitMQ

Run on all 3 app servers !!! Not the RabbitMQ servers !!!

Using HAProxy

# Install HAProxy
apt install haproxy

Append this config to /etc/haproxy/haproxy.cfg config file:

# ---------------------------------------------------------------------
# 1. AMQP Client Traffic (Port 5672)
# ---------------------------------------------------------------------
frontend rabbitmq_amqp_frontend
    bind *:5672
    mode tcp
    option clitcpka      # Enable TCP keep-alives for the client
    timeout client 3h    # Allow long-lived connections
    default_backend rabbitmq_amqp_backend

backend rabbitmq_amqp_backend
    mode tcp
    balance roundrobin
    option srvtcpka      # Enable TCP keep-alives for the server
    timeout server 3h    # Match client timeout
    
    # The 'check' flag tells HAProxy to monitor node health
    # 'inter 5s' means it checks every 5 seconds
    # Server 1's IP address
    server node1 192.168.100.140:5672 check inter 5s rise 2 fall 3
    # Server 2's IP address
    server node2 192.168.100.141:5672 check inter 5s rise 2 fall 3
    # Server 3's IP address
    server node3 192.168.100.142:5672 check inter 5s rise 2 fall 3

# ---------------------------------------------------------------------
# 2. Management UI Traffic (Port 15672)
# ---------------------------------------------------------------------
frontend rabbitmq_mgmt_frontend
    bind *:15672
    mode http
    default_backend rabbitmq_mgmt_backend

backend rabbitmq_mgmt_backend
    mode http
    balance roundrobin
    # Server 1's IP address
    server node1 192.168.100.140:15672 check
    # Server 2's IP address
    server node2 192.168.100.141:15672 check
    # Server 3's IP address
    server node3 192.168.100.142:15672 check