一、为什么选CentOS 7 + RabbitMQ?
在天翼云等公有云环境中,CentOS 7依然是最稳定的服务器操作系统之一。虽然CentOS 8已经停更,但7的生命周期还在,内核3.10对RabbitMQ的Erlang运行时兼容性经过了充分验证。
RabbitMQ本身用Erlang编写,对操作系统的依赖非常轻,但对内存和CPU调度敏感。CentOS 7的SELinux和firewalld配合得当的情况下,反而是加分项——它能帮你在上线前就暴露权限和端口问题,而不是等到凌晨三点生产环境炸了才发现。
选型逻辑很简单:CentOS 7提供稳定底座,RabbitMQ提供可靠消息通路,天翼云提供弹性资源,三者组合就是中小团队消息队列的最优解。
二、环境准备:别急着装,先把地基打好
2.1 系统要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2核 | 4核及以上 |
| 内存 | 2GB | 4GB及以上(RabbitMQ吃内存) |
| 磁盘 | 20GB | 50GB SSD(消息持久化写入频繁) |
| 系统 | CentOS 7.9 | CentOS 7.9 最新版 |
2.2 系统初始化
SSH登录到天翼云的CentOS 7主机后,先做三件事:
# 1. 更新系统到最新
yum update -y
# 2. 关闭SELinux(生产环境建议设为permissive而非直接关闭)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 3. 关闭swap(Erlang对swap极度敏感,会导致性能骤降甚至节点崩溃)
swapoff -a
sed -i '/swap/d' /etc/fstab
特别强调第三步:这是90%的新手会忽略的坑。RabbitMQ官方文档明确指出,Erlang虚拟机在使用swap时会产生严重的GC停顿,消息延迟可能从毫秒级飙升到秒级。在天翼云上,你可以直接选不带swap的云主机规格,从源头杜绝这个问题。
三、安装Erlang:RabbitMQ的命脉
RabbitMQ是Erlang写的,没有Erlang就没有RabbitMQ。但CentOS 7官方源里的Erlang版本只有18.x,而RabbitMQ 3.12+需要Erlang 25.x甚至26.x。所以必须用RabbitMQ官方提供的Erlang源。
步骤:
# 1. 安装依赖工具
yum install -y wget socat logrotate
# 2. 下载并安装Erlang 26.x(RabbitMQ 3.13推荐版本)
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.3/erlang-26.2.5.3-1.el7.x86_64.rpm
rpm -Uvh erlang-26.2.5.3-1.el7.x86_64.rpm
# 3. 验证安装
erl -version
# 输出示例:Erlang/OTP 26 [erts-14.2.5] ...
安装完成后,erl命令应该能直接进入Erlang交互 shell。如果报错找不到命令,执行 source /etc/profile 刷新环境变量。
四、安装RabbitMQ:三条命令搞定
4.1 添加官方YUM源
RabbitMQ官方提供了专门的YUM仓库,比自己编译安装省心一百倍:
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-3.13.7-1.el7.noarch.rpm
rpm -Uvh rabbitmq-server-3.13.7-1.el7.noarch.rpm
4.2 启动服务并设置开机自启
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
systemctl status rabbitmq-server
看到 active (running) 状态,说明RabbitMQ已经跑起来了。
4.3 开放防火墙端口
RabbitMQ默认监听 5672(AMQP协议)和 15672(管理控制台):
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --reload
如果你用的是天翼云的安全组,别忘了在控制台也把这两个端口放行,否则外网根本连不上。
五、管理控制台配置:生产环境必做的三件事
安装完成只是第一步,真正的生产化配置才是关键。
5.1 创建管理员账号
默认的guest账号只能localhost登录,生产环境必须新建:
rabbitmqctl add_user admin YourStrongPassword123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
然后删除guest账号:
rabbitmqctl delete_user guest
5.2 修改监听地址
默认RabbitMQ只监听127.0.0.1,需要改成0.0.0.0才能接受远程连接。编辑配置文件:
vi /etc/rabbitmq/rabbitmq.conf
添加以下内容:
listeners.tcp.default = 5672
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
loopback_users.guest = false
重启服务:
systemctl restart rabbitmq-server
5.3 开启消息持久化
消息持久化是RabbitMQ可靠性的基石。在创建队列时指定:
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'
这条策略的意思是:所有以 ha. 开头的队列,自动在集群所有节点上同步复制。即使某个节点挂了,消息也不会丢。
六、客户端连接验证
6.1 浏览器访问管理控制台
在本地浏览器输入 http://天翼云主机IP:15672,用刚才创建的admin账号登录,你会看到完整的管理界面:连接数、队列数、消息速率、内存占用,一目了然。
6.2 Python客户端测试
import pika
credentials = pika.PlainCredentials('admin', 'YourStrongPassword123')
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='天翼云主机IP', port=5672, credentials=credentials)
)
channel = connection.channel()
# 声明一个持久化队列
channel.queue_declare(queue='test_queue', durable=True)
# 发送一条持久化消息
channel.basic_publish(
exchange='',
routing_key='test_queue',
body='Hello RabbitMQ on CentOS 7',
properties=pika.BasicProperties(delivery_mode=2) # 2表示持久化
)
print("消息已发送")
connection.close()
运行后去管理控制台看,test_queue 队列里应该有一条消息,且Durable标记为True。
6.3 Java客户端测试(Spring Boot场景)
在 application.yml 中配置:
spring:
rabbitmq:
host: 天翼云主机IP
port: 5672
username: admin
password: YourStrongPassword123
virtual-host: /
listener:
simple:
acknowledge-mode: manual
然后用 @RabbitListener 注解监听队列即可。
七、生产环境性能调优:这五个参数决定生死
根据我在天翼云上跑了上百个RabbitMQ实例的经验,以下五个参数直接影响生产稳定性:
| 参数 | 默认值 | 生产推荐值 | 作用 |
|---|---|---|---|
vm_memory_high_watermark |
0.4 | 0.6 | 内存使用超过60%时阻塞生产者,防止OOM |
disk_free_limit |
50MB | 2GB | 磁盘剩余不足2GB时停止接受消息 |
channel_max |
0(无限制) | 2000 | 限制单连接最大通道数,防连接耗尽 |
connection_max |
无限制 | 1000 | 限制最大连接数 |
log.file.level |
info | warning | 生产环境降日志级别,减少IO压力 |
这些参数都写在 /etc/rabbitmq/rabbitmq.conf 中,修改后重启生效。
八、常见故障排查
问题1:Erlang报错 "memory allocation failed"
原因:内存不足或swap未关闭。解决:增加内存或确保swap已禁用。
问题2:管理控制台5672端口连不上
原因:防火墙或天翼云安全组未放行。解决:firewall-cmd 和安全组双重检查。
问题3:消息发出去就丢了
原因:队列未设durable,消息未设delivery_mode=2。解决:队列和消息都必须显式声明持久化。
问题4:节点频繁flapping(闪断)
原因:心跳超时。在 rabbitmq.conf 中调整 heartbeat = 60,单位是秒。
九、总结
从CentOS 7系统初始化,到Erlang环境搭建,再到RabbitMQ安装、管理控制台配置、客户端验证、生产调优,这套流程我在天翼云上反复验证过,稳定可靠。
核心逻辑其实就三句话:Erlang是地基,持久化是保险,调优是杠杆。 地基不稳(Erlang版本不对)一切白搭,保险不买(持久化不开)消息必丢,杠杆不调(参数不优化)高并发必崩。