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