消息队列是现代分布式系统中不可或缺的组件,而RabbitMQ作为最流行的开源消息代理之一,以其可靠性、灵活性和易用性著称。我在多个生产环境中使用RabbitMQ处理过日均百万级消息,它的稳定性给我留下了深刻印象。特别是在电商秒杀、日志收集等场景下,RabbitMQ的表现尤为出色。
在Ubuntu上部署RabbitMQ是很多开发团队的标准操作。相比Windows环境,Linux下的RabbitMQ性能更优,资源占用更低。我建议在Ubuntu 20.04 LTS或22.04 LTS上进行安装,这两个版本都有长期支持,且软件仓库中的Erlang版本与RabbitMQ兼容性良好。
在开始安装前,我们需要确保系统处于最新状态。打开终端执行:
bash复制sudo apt update && sudo apt upgrade -y
这个命令会更新软件包列表并升级所有可升级的包。我遇到过因为系统未更新导致依赖冲突的情况,所以这步不能省略。
接下来检查关键依赖:
RabbitMQ对Erlang版本有严格要求。以RabbitMQ 3.11.x为例,需要Erlang 25.x。可以通过以下命令查看Erlang版本要求:
bash复制curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash
我建议使用RabbitMQ官方提供的Erlang仓库,这样可以确保版本兼容性。曾经有团队使用Ubuntu默认仓库的Erlang,结果遇到了奇怪的性能问题。
这是最推荐的安装方式,可以方便地获取更新。执行以下命令添加RabbitMQ仓库:
bash复制sudo apt-get install curl gnupg apt-transport-https -y
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
curl -1sLf "https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.packagecloud.rabbitmq.gpg > /dev/null
然后添加仓库源:
bash复制echo "deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
echo "deb-src [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/rabbitmq.list
更新并安装:
bash复制sudo apt-get update -y
sudo apt-get install -y rabbitmq-server
这个过程会自动安装所需版本的Erlang。我曾经尝试过手动编译安装,结果花了半天时间解决各种依赖问题,所以强烈建议使用APT仓库。
安装完成后,检查服务状态:
bash复制sudo systemctl status rabbitmq-server
你应该看到"active (running)"的状态。如果没有,可以尝试手动启动:
bash复制sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
RabbitMQ自带一个强大的管理界面,但需要手动启用:
bash复制sudo rabbitmq-plugins enable rabbitmq_management
启用后,可以通过http://localhost:15672 访问管理界面。默认用户名和密码都是"guest",但出于安全考虑,这个账号只能从本地访问。
生产环境必须创建专用管理员账号:
bash复制sudo rabbitmqctl add_user admin StrongPassword123
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
记得把"StrongPassword123"换成你自己的强密码。我曾经见过使用弱密码导致的安全事件,后果很严重。
sudo rabbitmqctl list_userssudo rabbitmqctl list_queuessudo rabbitmqctl list_exchangessudo rabbitmqctl list_bindings这些命令在排查问题时非常有用。建议定期检查队列积压情况,我遇到过因为消费者故障导致队列积压百万消息的情况。
RabbitMQ默认使用5672(AMQP)和15672(管理界面)端口。建议修改:
bash复制echo "listeners.tcp.default = 5673" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "management.tcp.port = 15673" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
sudo systemctl restart rabbitmq-server
对于生产环境,应该启用TLS:
bash复制sudo mkdir /etc/rabbitmq/ssl
# 将证书文件放入该目录
echo "listeners.ssl.default = 5671" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "ssl_options.cacertfile = /etc/rabbitmq/ssl/ca_certificate.pem" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "ssl_options.certfile = /etc/rabbitmq/ssl/server_certificate.pem" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "ssl_options.keyfile = /etc/rabbitmq/ssl/server_key.pem" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "ssl_options.verify = verify_peer" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "ssl_options.fail_if_no_peer_cert = true" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
sudo systemctl restart rabbitmq-server
只开放必要的端口:
bash复制sudo ufw allow 5673/tcp # AMQP
sudo ufw allow 15673/tcp # 管理界面
sudo ufw enable
RabbitMQ默认使用内存的40%,可以通过环境变量调整:
bash复制echo "RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=\"+A 32\"" | sudo tee -a /etc/rabbitmq/rabbitmq-env.conf
echo "vm_memory_high_watermark.relative = 0.6" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
对于消息持久化,建议使用SSD存储。我曾经在HDD上运行RabbitMQ,性能差了近10倍。
调整最大连接数:
bash复制echo "max_connections = 10000" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "channel_max = 2047" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
这些值需要根据服务器配置调整。过高的值可能导致内存不足。
RabbitMQ提供了Prometheus插件:
bash复制sudo rabbitmq-plugins enable rabbitmq_prometheus
然后可以通过http://localhost:15692/metrics 获取监控数据。
默认日志在/var/log/rabbitmq/。可以调整日志级别:
bash复制echo "log.console.level = info" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "log.file.level = warning" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
对于生产环境,建议将日志发送到集中式日志系统。
建议每月执行一次:
bash复制sudo rabbitmqctl force_gc
sudo rabbitmqctl eval 'supervisor2:terminate_child(rabbit_channel_sup_sup, channel_sup), supervisor2:restart_child(rabbit_channel_sup_sup, channel_sup).'
这可以释放长期运行积累的内存碎片。
如果RabbitMQ无法启动,首先检查日志:
bash复制sudo tail -n 100 /var/log/rabbitmq/rabbit@$(hostname).log
常见原因包括:
如果内存使用接近限制,可以:
大量连接会消耗资源。解决方案:
对于生产环境,建议配置集群实现高可用。基本步骤:
bash复制sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster rabbit@node1
sudo rabbitmqctl start_app
我曾经配置过跨数据中心的RabbitMQ集群,需要注意网络延迟和分区处理策略。
定期备份配置和数据:
bash复制# 备份配置
sudo cp -R /etc/rabbitmq /backup/rabbitmq_config
# 备份数据
sudo cp -R /var/lib/rabbitmq /backup/rabbitmq_data
恢复时,停止服务后覆盖相应目录即可。建议每月测试一次恢复流程。