RabbitMQ Kurulumu: Ubuntu ve Docker ile Adım Adım Kurulum Rehberi
Mesaj kuyruğu sistemleriyle ilk kez çalışmaya başladığımda RabbitMQ kurulumu bana basit bir iş gibi görünmüştü. Dokümantasyonu açtım, birkaç komut çalıştırdım, servis ayağa kalktı ve “tamam, kolay” dedim. Sonra production ortamına geçince her şey karmaşıklaştı. Kullanıcı izinleri, vhost yapılandırması, port yönetimi, servis otomatik başlatma… Bunların hiçbiri dokümanın ilk sayfasında yoktu. Bu yazıda size hem Ubuntu üzerine doğrudan kurulumu hem de Docker ile kurulumu anlatacağım, ama daha önemlisi bu kurulum süreçlerinde karşılaştığım gerçek sorunları ve çözümleri paylaşacağım.
Neden RabbitMQ?
Bunu atlamak istedim ama atlamayacağım çünkü önemli. Bir sistemde mesaj kuyruğuna ihtiyaç duyduğunuzda Kafka, Redis Pub/Sub, AWS SQS gibi alternatifleri de değerlendiriyorsunuzdur. RabbitMQ’nun öne çıktığı durumlar şunlar:
- AMQP protokolü gereksinimleri: Kurumsal sistemlerle entegrasyon
- Karmaşık yönlendirme kuralları: Exchange tipleri sayesinde mesajları çok esnek şekilde yönlendirebiliyorsunuz
- Orta ölçekli yük: Saniyede onlarca binlerce mesaj için mükemmel, milyonlar için Kafka düşünün
- Operasyonel basitlik: Kafka’ya kıyasla kurulumu ve yönetimi çok daha kolay
Şimdi işe koyulalım.
Ubuntu Üzerine Doğrudan Kurulum
Erlang Bağımlılığı ve Sürüm Uyumu
RabbitMQ Erlang üzerine yazılmış. Bu hem güç hem de baş ağrısı kaynağı. Güç, çünkü Erlang’ın dağıtık sistemler ve hata toleransı konusundaki özellikleri RabbitMQ’ya direkt yansıyor. Baş ağrısı, çünkü her RabbitMQ sürümü belirli Erlang sürümleriyle çalışıyor ve Ubuntu’nun varsayılan depolarındaki Erlang genellikle ya çok eski ya da uyumsuz.
Bu yüzden Erlang’ı doğrudan Erlang Solutions deposundan kurmak en sağlıklı yol.
# Sistem paketlerini güncelleyin
sudo apt-get update
sudo apt-get install -y curl gnupg apt-transport-https
# Erlang Solutions GPG anahtarını ekleyin
curl -1sLf "https://keyserver.ubuntu.com/pks/lookup?op=get&fingerprint=on&search=0xf77f1eda57ebb1cc"
| sudo gpg --dearmor | sudo tee /usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg > /dev/null
# RabbitMQ GPG anahtarını ekleyin
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA"
| sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
Şimdi depo kaynaklarını ekleyelim. Ubuntu 22.04 (Jammy) için:
# /etc/apt/sources.list.d/rabbitmq.list dosyası oluşturun
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Erlang için Launchpad PPA
deb [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu jammy main
## RabbitMQ ana deposu
deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
EOF
Şimdi kuruluma geçelim:
sudo apt-get update
# Erlang paketlerini önce kurun, sürüm sabitleme önemli
sudo 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
# RabbitMQ server kurulumu
sudo apt-get install -y rabbitmq-server
Burada bir not düşeyim: erlang-eldap paketi LDAP entegrasyonu için gerekli, kurumsal ortamlarda Active Directory ile RabbitMQ kullanıcılarını senkronize etmek istiyorsanız işinize yarayacak.
Servisi Yönetmek
# Servisi başlatın ve sistem açılışında otomatik başlamasını sağlayın
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
# Durumu kontrol edin
sudo systemctl status rabbitmq-server
# RabbitMQ'nun kendi durum komutu daha fazla bilgi verir
sudo rabbitmqctl status
rabbitmqctl status çıktısında dikkat etmeniz gereken şeyler: Erlang sürümü, RabbitMQ sürümü, çalışan uygulamalar listesi ve dinlenen portlar. Eğer servis başlamışsa ama rabbitmqctl status hata veriyorsa genellikle Erlang sürüm uyumsuzluğu vardır.
Yönetim Arayüzünü Etkinleştirmek
RabbitMQ varsayılan olarak web arayüzü olmadan gelir. Yönetim eklentisini aktifleştirmek için:
sudo rabbitmq-plugins enable rabbitmq_management
# Eklentinin aktif olduğunu doğrulayın
sudo rabbitmq-plugins list
Artık http://sunucu-ip:15672 adresinden web arayüzüne erişebilirsiniz. Ama varsayılan guest kullanıcısıyla giriş yapmaya çalışırsanız hata alırsınız. Bu kasıtlı bir güvenlik kısıtlaması: guest kullanıcısı sadece localhost üzerinden bağlanabilir.
Kullanıcı Yönetimi
Gerçek ortamlarda her uygulama için ayrı kullanıcı oluşturmanızı şiddetle öneririm. Tek bir admin kullanıcısı kullanmak hem güvenlik riski hem de sorun tespitini zorlaştırıyor.
# Admin kullanıcı oluşturun
sudo rabbitmqctl add_user admin guclu-bir-sifre
sudo rabbitmqctl set_user_tags admin administrator
# Uygulama kullanıcısı oluşturun
sudo rabbitmqctl add_user myapp myapp-sifresi
# Virtual host oluşturun
sudo rabbitmqctl add_vhost myapp-vhost
# Kullanıcıya vhost üzerinde tam izin verin
sudo rabbitmqctl set_permissions -p myapp-vhost myapp ".*" ".*" ".*"
# Admin kullanıcısına tüm vhostlarda izin verin
sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
sudo rabbitmqctl set_permissions -p myapp-vhost admin ".*" ".*" ".*"
# Kullanıcıları listeleyin
sudo rabbitmqctl list_users
set_permissions komutundaki üç "." parametresi sırasıyla configure, write ve read izinleri için regex ifadeleri. "." tüm kaynaklara izin verir. Üretim ortamında bu ifadeleri daraltarak queue bazlı erişim kontrolü yapabilirsiniz. Örneğin sadece “orders” ile başlayan kuyruklara yazma izni vermek için "^orders." kullanabilirsiniz.
RabbitMQ Konfigürasyonu
Varsayılan yapılandırma geliştirme ortamı için yeterli ama production için birkaç şeyi değiştirmeniz gerekiyor. /etc/rabbitmq/rabbitmq.conf dosyasını oluşturun:
sudo tee /etc/rabbitmq/rabbitmq.conf <<EOF
# Bellek limiti - toplam RAM'in %60'ı geçince uyarı verir
vm_memory_high_watermark.relative = 0.6
# Disk limiti - disk bu kadar dolunca publish işlemi durur
disk_free_limit.absolute = 2GB
# Bağlantı heartbeat süresi (saniye)
heartbeat = 60
# Varsayılan vhost
default_vhost = /
# Yönetim arayüzü için istatistik toplama aralığı
management.rates_mode = basic
# Log seviyesi
log.console.level = info
log.file.level = info
EOF
sudo systemctl restart rabbitmq-server
vm_memory_high_watermark değeri sık atlanan ama kritik bir parametre. RabbitMQ bu eşiği geçince yeni mesaj kabul etmeyi durdurur. Sunucunuzda RabbitMQ dışında başka servisler de varsa bu değeri daha da düşürün.
Docker ile Kurulum
Docker kurulumunu tercih ettiğim durumlar var: geliştirme ortamı kurulumu, CI/CD pipeline testleri ve birden fazla RabbitMQ örneği çalıştırmam gereken senaryolar. Production için de Docker kullanıyorum ama bu durumda daha dikkatli olmak gerekiyor.
Tek Konteyner ile Başlangıç
docker run -d
--name rabbitmq
--hostname rabbitmq-node1
-p 5672:5672
-p 15672:15672
-e RABBITMQ_DEFAULT_USER=admin
-e RABBITMQ_DEFAULT_PASS=guclu-sifre
-e RABBITMQ_DEFAULT_VHOST=myapp
-v rabbitmq-data:/var/lib/rabbitmq
rabbitmq:3.13-management
Burada --hostname parametresine dikkat edin. RabbitMQ node adını hostname’den türetir ve bu ad cluster verilerini saklamak için kullanılır. Hostname değiştirirse veriler kaybolabilir. Bu yüzden her zaman explicit olarak belirtin.
rabbitmq:3.13-management imajı yönetim eklentisini önceden aktif edilmiş olarak geliyor. Sadece rabbitmq:3.13 kullanırsanız web arayüzü olmadan gelir.
Docker Compose ile Kurulum
Geliştirme ortamı için tek komutla ayağa kalkacak bir yapı:
# docker-compose.yml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
hostname: rabbitmq-node1
restart: unless-stopped
ports:
- "5672:5672" # AMQP protokolü
- "15672:15672" # Yönetim arayüzü
- "5671:5671" # AMQP TLS
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-changeme}
RABBITMQ_DEFAULT_VHOST: myapp
volumes:
- rabbitmq-data:/var/lib/rabbitmq
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./definitions.json:/etc/rabbitmq/definitions.json:ro
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
volumes:
rabbitmq-data:
driver: local
healthcheck kısmını atlayan çok görüyorum. Bu önemli çünkü RabbitMQ konteyner başladığında hazır olmayabiliyor, uygulamanızın bağlanmaya çalışması için önce servisin tamamen ayağa kalkması gerekiyor. depends_on ile birlikte kullanıldığında uygulama konteynerı RabbitMQ gerçekten hazır olmadan başlamıyor.
Definitions ile Otomatik Yapılandırma
Docker ortamında her yeniden başlatmada kullanıcıları, vhostları ve queue’ları elle oluşturmak istemezsiniz. RabbitMQ’nun definitions özelliği bunu çözüyor:
# Mevcut yapılandırmayı export edin
# Web arayüzünden: Overview > Export definitions
# ya da API ile:
curl -u admin:sifre http://localhost:15672/api/definitions > definitions.json
Ya da sıfırdan bir definitions.json oluşturun:
{
"vhosts": [
{"name": "myapp"}
],
"users": [
{
"name": "myapp-service",
"password_hash": "...",
"tags": ""
}
],
"permissions": [
{
"user": "myapp-service",
"vhost": "myapp",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"queues": [
{
"name": "orders",
"vhost": "myapp",
"durable": true,
"auto_delete": false,
"arguments": {
"x-message-ttl": 86400000,
"x-dead-letter-exchange": "dlx"
}
}
],
"exchanges": [
{
"name": "dlx",
"vhost": "myapp",
"type": "direct",
"durable": true,
"auto_delete": false
}
]
}
Bu dosyayı rabbitmq.conf içinde tanımlayın:
# rabbitmq.conf'a ekleyin
management.load_definitions = /etc/rabbitmq/definitions.json
Artık konteyner her başladığında bu yapılandırma otomatik uygulanıyor.
Kurulum Sonrası Doğrulama
Kurulum tamamlandı diyip geçmeyin. Şu kontrolleri yapın:
# Node bilgilerini görüntüleyin
sudo rabbitmqctl node_health_check
# Queue listesi (boş olmalı ama komut çalışmalı)
sudo rabbitmqctl list_queues name messages consumers
# Exchange listesi
sudo rabbitmqctl list_exchanges
# Bağlantıları listeleyin
sudo rabbitmqctl list_connections
# Port dinlemelerini kontrol edin
ss -tlnp | grep -E '5672|15672'
Eğer bir uygulama üzerinden de test etmek istiyorsanız Python ile hızlı bir bağlantı testi yapabilirsiniz:
import pika
credentials = pika.PlainCredentials('admin', 'guclu-sifre')
parameters = pika.ConnectionParameters(
host='localhost',
port=5672,
virtual_host='myapp',
credentials=credentials,
connection_attempts=3,
retry_delay=2
)
try:
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
# Test mesajı gönder
channel.queue_declare(queue='test', durable=True)
channel.basic_publish(
exchange='',
routing_key='test',
body='RabbitMQ calisiyor!'
)
print("Mesaj basariyla gonderildi")
connection.close()
except Exception as e:
print(f"Baglanti hatasi: {e}")
Sık Karşılaşılan Sorunlar
“Error: unable to connect to node rabbit@hostname”: rabbitmqctl komutu çalışmıyorsa çoğunlukla erlang cookie uyumsuzluğu. /var/lib/rabbitmq/.erlang.cookie dosyasının izinlerine bakın, sadece rabbitmq kullanıcısı okuyabilmeli (400 izni).
Yönetim arayüzüne uzaktan erişilemiyor: Firewall kontrolü yapın. UFW kullanıyorsanız:
sudo ufw allow 15672/tcp
sudo ufw allow 5672/tcp
RabbitMQ servis başlamıyor, log dosyasında disk hatası: disk_free_limit değerine bakın. Disk dolmuş olabilir ya da limit çok yüksek ayarlanmıştır.
Docker’da konteyner sürekli restart oluyor: docker logs rabbitmq ile bakmadan restart sayısını artırmayın. Çoğunlukla ya yanlış volume mount ya da konfigürasyon hatası.
Güvenlik İçin Minimum Yapılması Gerekenler
Bu bir kurulum yazısı ama güvenliği atlayamam. En azından şunları yapın:
guestkullanıcısını silin ya da devre dışı bırakın- Her uygulama için ayrı kullanıcı ve vhost oluşturun
- Yönetim arayüzünü (15672) dışarıya açmayın, VPN veya SSH tüneli kullanın
rabbitmq.confiçindeloopback_usersayarını yapılandırın- Erlang cookie’yi tahmin edilemez bir değerle değiştirin
# Güçlü Erlang cookie oluşturun
sudo systemctl stop rabbitmq-server
echo $(openssl rand -base64 32) | sudo tee /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo systemctl start rabbitmq-server
Sonuç
RabbitMQ kurulumu iki aşamada düşünülmeli: servisi ayağa kaldırmak ve production’a hazır hale getirmek. Çoğu kaynak birinci aşamada duruyor. Erlang sürüm uyumu, kullanıcı yönetimi, konfigürasyon parametreleri, definitions ile otomatik yapılandırma ve temel güvenlik adımları ikinci aşamayı oluşturuyor.
Docker kurulumu geliştirme ortamları için gerçekten hayat kurtarıcı, birkaç dakikada çalışan bir RabbitMQ örneği elde ediyorsunuz. Ubuntu üzerine doğrudan kurulum ise uzun vadeli, verilerin korunmasının kritik olduğu ortamlar için daha kontrol edilebilir bir seçenek. Hangisini seçerseniz seçin, kurulum sonrası doğrulama adımlarını atlamamanızı ve en azından temel güvenlik önlemlerini uygulamanızı öneririm.
Bir sonraki yazıda RabbitMQ cluster kurulumunu ve yük dengeleme stratejilerini ele alacağım.
