Why RabbitMQ?
RabbitMQ is a reliable, mature message broker that supports multiple messaging protocols including AMQP, MQTT, and STOMP. It's trusted by thousands of companies worldwide for mission-critical messaging needs.
Prerequisites
Development
- • 1+ CPU cores
- • 2 GB RAM minimum
- • 10 GB SSD storage
- • Ubuntu 20.04/22.04 LTS
Production
- • 2+ CPU cores
- • 4+ GB RAM recommended
- • 50+ GB NVMe SSD
- • Dedicated network interface
Initial Server Setup
Update system and install dependencies:
# Update system packages
sudo apt update && sudo apt upgrade -y
# Install essential tools
sudo apt install -y curl gnupg apt-transport-https
# Set timezone (adjust as needed)
sudo timedatectl set-timezone America/New_YorkInstallation
Install Erlang
RabbitMQ requires Erlang/OTP. Install from the official repository:
# Add Cloudsmith signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq-erlang.gpg > /dev/null
# Add Erlang repository
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-erlang.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq-erlang.list
# Update and install Erlang
sudo apt update
sudo apt 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-xmerlInstall RabbitMQ Server
Add RabbitMQ repository and install:
# Add RabbitMQ signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq-server.gpg > /dev/null
# Add RabbitMQ repository
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-server.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
# Update and install RabbitMQ
sudo apt update
sudo apt install -y rabbitmq-server
# Start and enable RabbitMQ service
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
# Verify installation
sudo systemctl status rabbitmq-serverVerify Installation
Check RabbitMQ status:
# Check RabbitMQ status
sudo rabbitmqctl status
# Check cluster status
sudo rabbitmqctl cluster_status
# List enabled plugins
sudo rabbitmq-plugins listManagement Plugin
Enable Management UI
Enable the web-based management interface:
# Enable management plugin
sudo rabbitmq-plugins enable rabbitmq_management
# The management UI will be available at:
# http://YOUR_VPS_IP:15672
# Default credentials (change immediately!):
# Username: guest
# Password: guestSecurity Warning: The default 'guest' user can only connect from localhost. Create a new admin user for remote access.
Create Admin User
Create a new administrator user for management access:
# Create new admin user
sudo rabbitmqctl add_user admin YOUR_SECURE_PASSWORD
# Set administrator tag
sudo rabbitmqctl set_user_tags admin administrator
# Grant full permissions on default vhost
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# Optionally delete the default guest user
sudo rabbitmqctl delete_user guestConfiguration
Main Configuration File
Create or edit the RabbitMQ configuration:
sudo nano /etc/rabbitmq/rabbitmq.conf# Network Configuration
listeners.tcp.default = 5672
management.tcp.port = 15672
# Memory Management
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark_paging_ratio = 0.75
# Disk Free Space Limit
disk_free_limit.absolute = 2GB
# Connection Limits
channel_max = 128
# Heartbeat (in seconds)
heartbeat = 60
# Default Virtual Host
default_vhost = /
default_user = admin
default_pass = YOUR_SECURE_PASSWORD
default_user_tags.administrator = true
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write = .*
# Logging
log.file.level = info
log.console = true
log.console.level = infoEnvironment Configuration
Set environment variables for RabbitMQ:
sudo nano /etc/rabbitmq/rabbitmq-env.conf# Node name (useful for clustering)
NODENAME=rabbit@$(hostname -s)
# Data directory
RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia
# Log directory
RABBITMQ_LOG_BASE=/var/log/rabbitmq
# Config file location
RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq
# Enable TLS
# RABBITMQ_CTL_ERL_ARGS="-proto_dist inet_tls"# Restart RabbitMQ to apply changes
sudo systemctl restart rabbitmq-server
# Verify configuration
sudo rabbitmqctl environmentUser Management
Managing Users
Common user management commands:
# List all users
sudo rabbitmqctl list_users
# Add a new user
sudo rabbitmqctl add_user myapp myapp_password
# Set user tags (administrator, monitoring, policymaker, management, none)
sudo rabbitmqctl set_user_tags myapp monitoring
# Change user password
sudo rabbitmqctl change_password myapp new_password
# Delete a user
sudo rabbitmqctl delete_user myapp
# Authenticate a user (test credentials)
sudo rabbitmqctl authenticate_user myapp myapp_passwordSetting Permissions
Configure user permissions on virtual hosts:
# Set permissions: configure, write, read (regex patterns)
# Full access to all resources in default vhost
sudo rabbitmqctl set_permissions -p / myapp ".*" ".*" ".*"
# Read-only access to queues starting with "events."
sudo rabbitmqctl set_permissions -p / readonly "" "" "events\..*"
# Producer: write to exchanges, read from nothing
sudo rabbitmqctl set_permissions -p / producer "" ".*" ""
# Consumer: read from queues, write to nothing
sudo rabbitmqctl set_permissions -p / consumer "" "" ".*"
# List permissions for a user
sudo rabbitmqctl list_user_permissions myapp
# Clear permissions
sudo rabbitmqctl clear_permissions -p / myappVirtual Hosts
Managing Virtual Hosts
Virtual hosts provide logical separation for different applications:
# List virtual hosts
sudo rabbitmqctl list_vhosts
# Add a new virtual host
sudo rabbitmqctl add_vhost production
sudo rabbitmqctl add_vhost staging
sudo rabbitmqctl add_vhost development
# Set permissions for users on vhosts
sudo rabbitmqctl set_permissions -p production produser ".*" ".*" ".*"
sudo rabbitmqctl set_permissions -p staging devuser ".*" ".*" ".*"
# List permissions on a vhost
sudo rabbitmqctl list_permissions -p production
# Delete a virtual host (deletes all resources within!)
sudo rabbitmqctl delete_vhost staging
# Set metadata/description
sudo rabbitmqctl update_vhost_metadata production --description "Production environment"Security
Firewall Configuration
Configure UFW firewall rules:
# Allow SSH
sudo ufw allow ssh
# AMQP port (client connections)
sudo ufw allow 5672/tcp
# Management UI (restrict to your IP in production)
sudo ufw allow from YOUR_IP to any port 15672
# Erlang distribution (clustering only - restrict to cluster nodes)
# sudo ufw allow from CLUSTER_NODE_IP to any port 25672
# AMQPS (TLS) - if using SSL
# sudo ufw allow 5671/tcp
# Enable firewall
sudo ufw enable
sudo ufw status verboseSecurity Best Practices
Essential security hardening:
SSL/TLS Setup
Generate SSL Certificates
Create self-signed certificates (use Let's Encrypt for production):
# Create SSL directory
sudo mkdir -p /etc/rabbitmq/ssl
cd /etc/rabbitmq/ssl
# Generate CA key and certificate
sudo openssl genrsa -out ca-key.pem 4096
sudo openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=RabbitMQ-CA"
# Generate server key and CSR
sudo openssl genrsa -out server-key.pem 4096
sudo openssl req -new -key server-key.pem -out server-csr.pem -subj "/CN=$(hostname)"
# Sign server certificate
sudo openssl x509 -req -days 365 -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
# Set permissions
sudo chown -R rabbitmq:rabbitmq /etc/rabbitmq/ssl
sudo chmod 600 /etc/rabbitmq/ssl/*.pemConfigure TLS
Update RabbitMQ configuration for TLS:
# Add to /etc/rabbitmq/rabbitmq.conf
# Disable plain TCP listener (optional, for TLS-only)
# listeners.tcp = none
# TLS listener
listeners.ssl.default = 5671
# SSL Certificate paths
ssl_options.cacertfile = /etc/rabbitmq/ssl/ca-cert.pem
ssl_options.certfile = /etc/rabbitmq/ssl/server-cert.pem
ssl_options.keyfile = /etc/rabbitmq/ssl/server-key.pem
# Verify client certificates (optional)
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = false
# TLS versions (disable older versions)
ssl_options.versions.1 = tlsv1.3
ssl_options.versions.2 = tlsv1.2
# Management UI over HTTPS
management.ssl.port = 15671
management.ssl.cacertfile = /etc/rabbitmq/ssl/ca-cert.pem
management.ssl.certfile = /etc/rabbitmq/ssl/server-cert.pem
management.ssl.keyfile = /etc/rabbitmq/ssl/server-key.pem# Restart RabbitMQ
sudo systemctl restart rabbitmq-server
# Test TLS connection
openssl s_client -connect localhost:5671 -CAfile /etc/rabbitmq/ssl/ca-cert.pemClustering
High Availability: RabbitMQ clustering provides high availability and increased throughput. Minimum recommended cluster size is 3 nodes for quorum queue support.
Prepare Nodes
Ensure all nodes can communicate:
# On each node, add all nodes to /etc/hosts
sudo nano /etc/hosts
# Add entries like:
192.168.1.10 rabbit1
192.168.1.11 rabbit2
192.168.1.12 rabbit3
# Set hostname (on each node)
sudo hostnamectl set-hostname rabbit1 # Adjust for each nodeShare Erlang Cookie
All nodes must share the same Erlang cookie:
# On the first node, get the cookie value
sudo cat /var/lib/rabbitmq/.erlang.cookie
# Copy this cookie to all other nodes
# On other nodes:
sudo systemctl stop rabbitmq-server
sudo nano /var/lib/rabbitmq/.erlang.cookie
# Paste the cookie value
# Set correct permissions
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
# Start RabbitMQ
sudo systemctl start rabbitmq-serverJoin Cluster
Join additional nodes to the cluster:
# On nodes 2 and 3, join the cluster
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@rabbit1
sudo rabbitmqctl start_app
# Verify cluster status
sudo rabbitmqctl cluster_statusConfigure Quorum Queues
Create highly available queues:
# Set a policy for quorum queues
sudo rabbitmqctl set_policy ha-queues "^ha\." \
'{"queue-type":"quorum"}' \
--priority 1 \
--apply-to queues
# Or set default queue type to quorum
# Add to rabbitmq.conf:
# default_queue_type = quorumPerformance Tuning
System Limits
Increase system limits for production:
# Edit limits configuration
sudo nano /etc/security/limits.conf
# Add these lines:
rabbitmq soft nofile 65536
rabbitmq hard nofile 65536
# Also update systemd service limits
sudo mkdir -p /etc/systemd/system/rabbitmq-server.service.d
sudo nano /etc/systemd/system/rabbitmq-server.service.d/limits.conf[Service]
LimitNOFILE=65536# Reload systemd and restart
sudo systemctl daemon-reload
sudo systemctl restart rabbitmq-server
# Verify limits
sudo rabbitmqctl status | grep -A 5 "File Descriptors"Memory Configuration
Optimize memory settings:
# Add to /etc/rabbitmq/rabbitmq.conf
# Memory threshold (percentage of RAM)
vm_memory_high_watermark.relative = 0.6
# Or use absolute value
# vm_memory_high_watermark.absolute = 2GB
# Paging threshold
vm_memory_high_watermark_paging_ratio = 0.75
# Memory calculation (RSS vs allocated)
vm_memory_calculation_strategy = rssConnection and Channel Tuning
Optimize for high connection counts:
# Add to /etc/rabbitmq/rabbitmq.conf
# Maximum number of channels per connection
channel_max = 128
# TCP listen backlog
tcp_listen_options.backlog = 4096
# TCP buffer sizes
tcp_listen_options.sndbuf = 32768
tcp_listen_options.recbuf = 32768
# Heartbeat interval (seconds)
heartbeat = 60
# Connection timeout
handshake_timeout = 30000Queue Performance
Optimize queue behavior:
# Lazy queues (for large queues, reduces memory)
sudo rabbitmqctl set_policy lazy-queues "^lazy\." \
'{"queue-mode":"lazy"}' \
--priority 1 \
--apply-to queues
# Message TTL policy (auto-expire old messages)
sudo rabbitmqctl set_policy message-ttl ".*" \
'{"message-ttl":86400000}' \
--priority 0 \
--apply-to queues
# Queue length limit
sudo rabbitmqctl set_policy queue-length "^limited\." \
'{"max-length":100000,"overflow":"reject-publish"}' \
--priority 1 \
--apply-to queuesMonitoring
Built-in Monitoring
Use RabbitMQ commands for monitoring:
# Overall status
sudo rabbitmqctl status
# List queues with message counts
sudo rabbitmqctl list_queues name messages consumers memory
# List connections
sudo rabbitmqctl list_connections user peer_host state
# List channels
sudo rabbitmqctl list_channels connection user number
# List exchanges
sudo rabbitmqctl list_exchanges name type
# List bindings
sudo rabbitmqctl list_bindings
# Node memory usage
sudo rabbitmqctl status | grep -A 20 "Memory"
# Check alarms
sudo rabbitmqctl status | grep -A 5 "Alarms"Enable Prometheus Metrics
Export metrics for Prometheus:
# Enable Prometheus plugin
sudo rabbitmq-plugins enable rabbitmq_prometheus
# Metrics available at:
# http://YOUR_VPS_IP:15692/metrics# Add to prometheus.yml scrape_configs:
- job_name: 'rabbitmq'
static_configs:
- targets: ['YOUR_VPS_IP:15692']
metrics_path: /metricsHealth Checks
Implement health monitoring:
#!/bin/bash
# /opt/rabbitmq-health.sh
# Check if RabbitMQ is running
if ! sudo rabbitmqctl status > /dev/null 2>&1; then
echo "CRITICAL: RabbitMQ is not running"
exit 2
fi
# Check for alarms
ALARMS=$(sudo rabbitmqctl status 2>/dev/null | grep -A 1 "Alarms" | tail -1)
if [[ "$ALARMS" != *"[]"* ]]; then
echo "WARNING: RabbitMQ alarms active: $ALARMS"
exit 1
fi
# Check cluster status (if clustered)
CLUSTER=$(sudo rabbitmqctl cluster_status 2>/dev/null | grep "Running Nodes" -A 1)
echo "OK: RabbitMQ is healthy"
echo "$CLUSTER"
exit 0sudo chmod +x /opt/rabbitmq-health.sh
sudo /opt/rabbitmq-health.shTroubleshooting
Common Issues
Memory Alarm (High Watermark)
# Check memory usage
sudo rabbitmqctl status | grep -A 20 "Memory"
# Increase watermark temporarily
sudo rabbitmqctl set_vm_memory_high_watermark 0.8
# Purge large queues if needed
sudo rabbitmqctl purge_queue queue_name
# Or configure memory limits properly in rabbitmq.confDisk Space Alarm
# Check disk usage
df -h /var/lib/rabbitmq
# Check RabbitMQ data size
sudo du -sh /var/lib/rabbitmq/mnesia
# Lower disk limit temporarily
sudo rabbitmqctl set_disk_free_limit 1GB
# Clean up old data
# Remove old logs
sudo rm -f /var/log/rabbitmq/*.log.*Connection Issues
# Check listener status
sudo rabbitmqctl status | grep -A 10 "Listeners"
# Test port connectivity
nc -zv localhost 5672
nc -zv localhost 15672
# Check firewall
sudo ufw status
# View connection errors in logs
sudo tail -100 /var/log/rabbitmq/rabbit@$(hostname).log | grep -i errorCluster Partition
# Check for partitions
sudo rabbitmqctl cluster_status | grep -A 5 "Network Partitions"
# Force sync (choose the partition to keep)
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@good_node
sudo rabbitmqctl start_app
# Configure partition handling in rabbitmq.conf:
# cluster_partition_handling = autohealLog Analysis
Check logs for issues:
# View main log
sudo tail -f /var/log/rabbitmq/rabbit@$(hostname).log
# View startup log
sudo tail -f /var/log/rabbitmq/startup_log
# Search for errors
sudo grep -i error /var/log/rabbitmq/*.log
# Enable debug logging temporarily
sudo rabbitmqctl set_log_level debug
# Remember to set back to info after debugging
sudo rabbitmqctl set_log_level infoReset and Recovery
Emergency reset procedures:
# Stop the application
sudo rabbitmqctl stop_app
# Reset to clean state (WARNING: removes all data!)
sudo rabbitmqctl reset
# Start the application
sudo rabbitmqctl start_app
# Force reset (use only if normal reset fails)
sudo rabbitmqctl force_resetWarning: Reset commands will delete all data including queues, exchanges, users, and virtual hosts. Always backup important data before resetting.
