RabbitMQ na VPS: instalacja, kolejki, exchanges, routing keys i monitoring
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Message Queuing
RabbitMQ to najpopularniejszy open source message broker, implementujący protokół AMQP (Advanced Message Queuing Protocol). Pozwala odsprzęgnąć komponenty systemu — producent wysyła wiadomości do brokera, konsument przetwarza je we własnym tempie. Idealne do przetwarzania asynchronicznego: wysyłka emaili, generowanie raportów, powiadomienia push, synchronizacja danych między mikroserwisami.
Instalacja RabbitMQ na Ubuntu 24.04
RabbitMQ wymaga Erlang/OTP jako środowiska uruchomieniowego. Najlepiej instalować z oficjalnego repozytorium Team RabbitMQ, które zawiera kompatybilne wersje obu pakietów.
# Dodaj klucz GPG i repozytorium Erlang
curl -fsSL https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc \
| gpg --dearmor -o /usr/share/keyrings/erlang-solutions.gpg
echo "deb [signed-by=/usr/share/keyrings/erlang-solutions.gpg] \
https://packages.erlang-solutions.com/ubuntu noble contrib" \
> /etc/apt/sources.list.d/erlang.list
# Dodaj repozytorium RabbitMQ
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey \
| gpg --dearmor -o /usr/share/keyrings/rabbitmq.gpg
echo "deb [signed-by=/usr/share/keyrings/rabbitmq.gpg] \
https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ noble main" \
> /etc/apt/sources.list.d/rabbitmq.list
# Instalacja Erlang i RabbitMQ
apt update
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 \
rabbitmq-server
# Uruchom i włącz autostart
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
# Sprawdz status
systemctl status rabbitmq-server
rabbitmqctl status Management UI — panel administracyjny
RabbitMQ ma wbudowany panel webowy (Management Plugin) dostępny na porcie 15672. Włącz go i
utwórz administratora — domyślny użytkownik guest działa tylko z localhost.
# Włącz Management Plugin
rabbitmq-plugins enable rabbitmq_management
# Utwórz administratora
rabbitmqctl add_user admin silnehaslo123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# Usuń domyślnego guesta (opcjonalnie, zalecane na produkcji)
rabbitmqctl delete_user guest
# Panel dostępny pod:
# http://IP_VPS:15672
# Login: admin / silnehaslo123
# Zabezpiecz port przez firewall (dostep tylko z Twojego IP)
ufw allow from TWOJ_IP to any port 15672
ufw deny 15672 Tworzenie exchanges i kolejek przez rabbitmqadmin
rabbitmqadmin to CLI klient Management API. Pozwala zarządzać exchanges, kolejkami
i bindingami z terminala — przydatne do automatyzacji i skryptów inicjalizacji.
# Pobierz rabbitmqadmin
wget http://localhost:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
mv rabbitmqadmin /usr/local/bin/
# Utwórz exchange typu direct
rabbitmqadmin declare exchange \
name=app.direct type=direct durable=true
# Utwórz exchange typu topic (wildcards)
rabbitmqadmin declare exchange \
name=app.topic type=topic durable=true
# Utwórz exchange typu fanout (broadcast)
rabbitmqadmin declare exchange \
name=app.fanout type=fanout durable=true
# Utwórz kolejki (durable = przezywa restart brokera)
rabbitmqadmin declare queue \
name=emails durable=true
rabbitmqadmin declare queue \
name=notifications durable=true
rabbitmqadmin declare queue \
name=reports durable=true
# Powiaz kolejki z exchange (binding)
rabbitmqadmin declare binding \
source=app.direct destination=emails routing_key=email
rabbitmqadmin declare binding \
source=app.direct destination=notifications routing_key=notification
# Topic exchange — routing z wildcardami
rabbitmqadmin declare binding \
source=app.topic destination=reports routing_key="report.#"
# Lista exchange i kolejek
rabbitmqadmin list exchanges
rabbitmqadmin list queues Dead-letter queue i TTL
Dead-letter queue (DLQ) przechwytuje wiadomości, które nie zostały przetworzone — NACK bez requeue, przekroczony TTL lub pełna kolejka. Skonfiguruj DLQ przy tworzeniu głównej kolejki:
# Utwórz exchange dla dead-letter
rabbitmqadmin declare exchange \
name=dlx type=direct durable=true
# Utwórz dead-letter queue
rabbitmqadmin declare queue \
name=emails.dead durable=true
# Powiaz DLQ z exchange DLX
rabbitmqadmin declare binding \
source=dlx destination=emails.dead routing_key=email.dead
# Utwórz glówna kolejke z DLQ i TTL 24h
rabbitmqadmin declare queue name=emails.main durable=true \
arguments='{"x-dead-letter-exchange":"dlx","x-dead-letter-routing-key":"email.dead","x-message-ttl":86400000,"x-max-length":10000}'
# Sprawdz konfiguracje kolejki
rabbitmqadmin show queue name=emails.main Przykład producent/konsument w Node.js (amqplib)
// producer.js — wysyłanie wiadomości
const amqp = require('amqplib');
async function sendEmail(to, subject, body) {
const conn = await amqp.connect('amqp://admin:silnehaslo123@localhost');
const channel = await conn.createChannel();
await channel.assertExchange('app.direct', 'direct', { durable: true });
const message = JSON.stringify({ to, subject, body });
channel.publish('app.direct', 'email', Buffer.from(message), {
persistent: true, // wiadomosc przezywa restart brokera
contentType: 'application/json',
});
console.log('Email queued:', to);
await channel.close();
await conn.close();
}
// consumer.js — przetwarzanie wiadomości
async function startWorker() {
const conn = await amqp.connect('amqp://admin:silnehaslo123@localhost');
const channel = await conn.createChannel();
await channel.assertQueue('emails', { durable: true });
channel.prefetch(1); // przetwarza 1 wiadomosc na raz
channel.consume('emails', async (msg) => {
if (!msg) return;
const data = JSON.parse(msg.content.toString());
try {
await sendEmailSMTP(data);
channel.ack(msg); // potwierdzenie — wiadomosc usunieta z kolejki
} catch (err) {
console.error('Failed:', err);
channel.nack(msg, false, false); // NACK — trafi do DLQ
}
});
} Monitoring — metryki i alerty
RabbitMQ eksportuje metryki przez Management API i opcjonalnie przez Prometheus endpoint. Kluczowe metryki do monitorowania:
| Metryka | Endpoint API | Alert gdy |
|---|---|---|
| Głębokość kolejki | /api/queues → messages | > 10 000 (backlog) |
| Wiadomości unacked | /api/queues → messages_unacknowledged | > 100 per consumer |
| Pamięć RAM | /api/nodes → mem_used | > 80% mem_limit |
| DLQ rozmiar | /api/queues/%2F/emails.dead | > 0 (każda failed msg) |
| Publish rate | /api/overview → message_stats | Nagły spadek do 0 |
# Włącz Prometheus plugin
rabbitmq-plugins enable rabbitmq_prometheus
# Metryki Prometheus dostępne na porcie 15692
curl http://localhost:15692/metrics | grep rabbitmq_queue_messages
# Sprawdz metryki przez Management API
curl -u admin:silnehaslo123 http://localhost:15672/api/queues/%2F/emails \
| python3 -m json.tool | grep -E "messages|consumers"