Message Broker Guide

    Self-Hosted RabbitMQ

    Deploy RabbitMQ, the most widely deployed open source message broker, on RamNode VPS. Enable reliable messaging for your applications.

    Ubuntu 20.04+
    RabbitMQ 3.13+
    ⏱️ 15-25 minutes

    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.

    Multiple messaging protocols (AMQP, MQTT, STOMP)
    Built-in clustering and high availability
    Web-based management UI
    Flexible routing with exchanges and bindings

    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
    1

    Initial Server Setup

    Update system and install dependencies:

    System Setup
    # 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_York

    Installation

    1

    Install Erlang

    RabbitMQ requires Erlang/OTP. Install from the official repository:

    Add Erlang 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-xmerl
    2

    Install RabbitMQ Server

    Add RabbitMQ repository and install:

    Install RabbitMQ
    # 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-server
    3

    Verify Installation

    Check RabbitMQ status:

    Check Status
    # Check RabbitMQ status
    sudo rabbitmqctl status
    
    # Check cluster status
    sudo rabbitmqctl cluster_status
    
    # List enabled plugins
    sudo rabbitmq-plugins list

    Management Plugin

    1

    Enable Management UI

    Enable the web-based management interface:

    Enable Management
    # 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: guest

    Security Warning: The default 'guest' user can only connect from localhost. Create a new admin user for remote access.

    2

    Create Admin User

    Create a new administrator user for management access:

    Create Admin User
    # 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 guest

    Configuration

    1

    Main Configuration File

    Create or edit the RabbitMQ configuration:

    Create Configuration
    sudo nano /etc/rabbitmq/rabbitmq.conf
    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 = info
    2

    Environment Configuration

    Set environment variables for RabbitMQ:

    Create Environment File
    sudo nano /etc/rabbitmq/rabbitmq-env.conf
    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"
    Apply Configuration
    # Restart RabbitMQ to apply changes
    sudo systemctl restart rabbitmq-server
    
    # Verify configuration
    sudo rabbitmqctl environment

    User Management

    1

    Managing Users

    Common user management commands:

    User 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_password
    2

    Setting Permissions

    Configure user permissions on virtual hosts:

    Permission Commands
    # 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 / myapp

    Virtual Hosts

    1

    Managing Virtual Hosts

    Virtual hosts provide logical separation for different applications:

    VHost Commands
    # 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

    1

    Firewall Configuration

    Configure UFW firewall rules:

    UFW 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 verbose
    2

    Security Best Practices

    Essential security hardening:

    Delete guest user: Remove or disable the default guest account
    Use strong passwords: Minimum 16 characters with complexity
    Enable TLS: Encrypt all connections with SSL/TLS
    Least privilege: Grant minimum required permissions
    Separate vhosts: Isolate applications using virtual hosts
    Restrict management: Limit management UI access by IP

    SSL/TLS Setup

    1

    Generate SSL Certificates

    Create self-signed certificates (use Let's Encrypt for production):

    Generate Certificates
    # 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/*.pem
    2

    Configure TLS

    Update RabbitMQ configuration for TLS:

    TLS Configuration
    # 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
    Apply TLS Configuration
    # Restart RabbitMQ
    sudo systemctl restart rabbitmq-server
    
    # Test TLS connection
    openssl s_client -connect localhost:5671 -CAfile /etc/rabbitmq/ssl/ca-cert.pem

    Clustering

    High Availability: RabbitMQ clustering provides high availability and increased throughput. Minimum recommended cluster size is 3 nodes for quorum queue support.

    1

    Prepare Nodes

    Ensure all nodes can communicate:

    Configure Hostnames
    # 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 node
    2

    Share Erlang Cookie

    All nodes must share the same Erlang cookie:

    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-server
    3

    Join Cluster

    Join additional nodes to the cluster:

    Join 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_status
    4

    Configure Quorum Queues

    Create highly available queues:

    Quorum Queue Policy
    # 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 = quorum

    Performance Tuning

    1

    System Limits

    Increase system limits for production:

    System Limits
    # 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
    limits.conf
    [Service]
    LimitNOFILE=65536
    Apply Limits
    # Reload systemd and restart
    sudo systemctl daemon-reload
    sudo systemctl restart rabbitmq-server
    
    # Verify limits
    sudo rabbitmqctl status | grep -A 5 "File Descriptors"
    2

    Memory Configuration

    Optimize memory settings:

    Memory Configuration
    # 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 = rss
    3

    Connection and Channel Tuning

    Optimize for high connection counts:

    Connection Tuning
    # 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 = 30000
    4

    Queue Performance

    Optimize queue behavior:

    Queue Policies
    # 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 queues

    Monitoring

    1

    Built-in Monitoring

    Use RabbitMQ commands for monitoring:

    Monitoring Commands
    # 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"
    2

    Enable Prometheus Metrics

    Export metrics for Prometheus:

    Enable Prometheus Plugin
    # Enable Prometheus plugin
    sudo rabbitmq-plugins enable rabbitmq_prometheus
    
    # Metrics available at:
    # http://YOUR_VPS_IP:15692/metrics
    Prometheus Configuration
    # Add to prometheus.yml scrape_configs:
    - job_name: 'rabbitmq'
      static_configs:
        - targets: ['YOUR_VPS_IP:15692']
      metrics_path: /metrics
    3

    Health Checks

    Implement health monitoring:

    Health Check Script
    #!/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 0
    Make Executable
    sudo chmod +x /opt/rabbitmq-health.sh
    sudo /opt/rabbitmq-health.sh

    Troubleshooting

    1

    Common Issues

    Memory Alarm (High Watermark)

    Resolve Memory Alarm
    # 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.conf

    Disk Space Alarm

    Resolve Disk 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

    Debug Connections
    # 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 error

    Cluster Partition

    Handle Partitions
    # 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 = autoheal
    2

    Log Analysis

    Check logs for issues:

    Log Commands
    # 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 info
    3

    Reset and Recovery

    Emergency reset procedures:

    Reset Node
    # 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_reset

    Warning: Reset commands will delete all data including queues, exchanges, users, and virtual hosts. Always backup important data before resetting.

    Next Steps

    Set up monitoring with Prometheus and Grafana
    Configure automated backups for definitions
    Implement dead letter exchanges for error handling
    Set up shovel or federation for multi-datacenter