在 CentOS 或 Ubuntu 服务器上同时部署 MySQL、Redis 和 RabbitMQ 是构建现代 Web 应用(尤其是基于 Java/Spring Boot 或 Python/Django/Flask 的后端)的标准架构。虽然这三者可以共存,但“安全”、“稳定”且“易于维护”是核心目标。
以下是一份基于生产环境最佳实践的部署指南,涵盖从系统准备到服务配置的关键步骤。
一、前期准备:系统级优化与安全加固
无论选择 CentOS 7/8 还是 Ubuntu 18.04/20.04/22.04,以下步骤通用:
1. 更新系统与内核
# CentOS
sudo yum update -y && sudo reboot
# Ubuntu
sudo apt update && sudo apt upgrade -y && sudo reboot
2. 配置防火墙(仅开放必要端口)
默认情况下,MySQL (3306)、Redis (6379)、RabbitMQ (5672, 15672) 不应直接暴露给公网。
-
iptables/firewalld (CentOS):
sudo firewall-cmd --permanent --add-port=3306/tcp # MySQL sudo firewall-cmd --permanent --add-port=6379/tcp # Redis sudo firewall-cmd --permanent --add-port=5672/tcp # RabbitMQ AMQP sudo firewall-cmd --permanent --add-port=15672/tcp # RabbitMQ Management UI sudo firewall-cmd --reload -
ufw (Ubuntu):
sudo ufw allow 3306/tcp sudo ufw allow 6379/tcp sudo ufw allow 5672/tcp sudo ufw allow 15672/tcp sudo ufw enable
⚠️ 重要安全建议:如果服务器有公网 IP,强烈建议将 MySQL 和 Redis 绑定到
127.0.0.1或通过内网 IP 访问,不要监听0.0.0.0。RabbitMQ 的管理界面也应限制 IP 访问。
3. 创建专用用户(非 root 运行)
虽然包管理器会自动创建用户,但确保权限最小化:
- MySQL 通常以
mysql用户运行。 - Redis 以
redis用户运行。 - RabbitMQ 以
rabbitmq用户运行。
二、安装 MySQL(关系型数据库)
CentOS 8+ / RHEL 8+
由于 CentOS 8 已 EOL,建议使用 AlmaLinux/Rocky 或继续用 CentOS 7(已停止支持,不推荐用于新生产环境)。这里以 Ubuntu 22.04 为例更常见,但逻辑一致。
Ubuntu 方式(推荐)
sudo apt install mysql-server -y
sudo systemctl enable mysql
sudo systemctl start mysql
CentOS 方式
# CentOS 7
sudo yum install mariadb-server mariadb -y
sudo systemctl enable mariadb
sudo systemctl start mariadb
# 或者安装 Oracle MySQL
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install mysql-community-server -y
sudo systemctl enable mysqld
sudo systemctl start mysqld
MySQL 安全加固
sudo mysql_secure_installation
按提示操作:
- 设置 root 密码
- 删除匿名用户
- 禁止 root 远程登录(关键!)
- 删除 test 数据库
- 刷新权限
配置多实例隔离(可选高级)
如果担心资源争抢,可在 /etc/my.cnf 中调整:
[mysqld]
innodb_buffer_pool_size = 1G # 根据总内存分配,留出足够给 Redis
max_connections = 200
bind-address = 127.0.0.1 # 仅限本地访问
三、安装 Redis(内存键值存储)
Ubuntu
sudo apt install redis-server -y
sudo systemctl enable redis-server
sudo systemctl start redis-server
CentOS
sudo yum install epel-release -y
sudo yum install redis -y
sudo systemctl enable redis
sudo systemctl start redis
Redis 安全加固
编辑 /etc/redis/redis.conf:
-
绑定地址:
bind 127.0.0.1 ::1 protected-mode yes -
设置密码(取消注释并修改):
requirepass your_strong_password_here -
重命名危险命令(可选但推荐):
rename-command FLUSHALL "" rename-command CONFIG "" rename-command SHUTDOWN "" -
重启 Redis:
sudo systemctl restart redis-server
四、安装 RabbitMQ(消息队列)
Ubuntu
# 添加官方仓库
curl -1sLf "https://keys.openpgp.org/v1/via/gpg/download_keys.sh" | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-archive-keyring.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/el/$(lsb_release -cs)/$(dpkg --print-architecture) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt update
sudo apt install rabbitmq-server -y
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
CentOS
# 安装 Erlang 依赖(RabbitMQ 需要)
sudo yum install erlang -y
sudo yum install rabbitmq-server -y
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
RabbitMQ 管理插件与用户配置
启用管理界面:
sudo rabbitmq-plugins enable rabbitmq_management
创建应用专用用户(避免使用 guest):
sudo rabbitmqctl add_user appuser StrongPassword123!
sudo rabbitmqctl set_permissions -p / appuser ".*" ".*" ".*"
sudo rabbitmqctl set_user_tags appuser administrator
注意:RabbitMQ 默认监听 5672(AMQP)和 15672(Web UI)。确保防火墙允许这些端口。
五、资源规划与性能调优(关键!)
三者共存时,最大的风险是 内存竞争。以下是典型资源分配建议(假设服务器为 8GB RAM):
| 组件 | 最大内存占用建议 | 说明 |
|---|---|---|
| MySQL | 2–4 GB | innodb_buffer_pool_size 设置为物理内存的 50–70% |
| Redis | 1–2 GB | 设置 maxmemory 策略,如 allkeys-lru |
| RabbitMQ | 512 MB – 1 GB | 默认即可,关注磁盘空间而非内存 |
| 操作系统 | 1–2 GB | 保留余量供 OS 和其他进程使用 |
关键配置示例:
Redis 内存限制
maxmemory 2gb
maxmemory-policy allkeys-lru
MySQL 缓冲池大小
innodb_buffer_pool_size = 3G
RabbitMQ 内存阈值
sudo rabbitmqctl set_vm_memory_high_watermark relative 0.4
当内存使用超过 40% 时,RabbitMQ 会暂停消费者以防止 OOM。
六、监控与健康检查
1. 使用 systemd 管理
所有服务均通过 systemctl 控制,便于开机自启和日志查看:
sudo journalctl -u mysql -f
sudo journalctl -u redis-server -f
sudo journalctl -u rabbitmq-server -f
2. 健康检查脚本
编写一个简单的 shell 脚本定期检查服务状态:
#!/bin/bash
if ! systemctl is-active --quiet mysql; then
echo "MySQL is down!" | mail -s "Alert: MySQL Down" admin@example.com
fi
if ! systemctl is-active --quiet redis-server; then
echo "Redis is down!" | mail -s "Alert: Redis Down" admin@example.com
fi
if ! systemctl is-active --quiet rabbitmq-server; then
echo "RabbitMQ is down!" | mail -s "Alert: RabbitMQ Down" admin@example.com
fi
3. 推荐使用 Prometheus + Grafana
对于生产环境,建议部署 Prometheus 采集指标,Grafana 展示面板:
- MySQL:
mysqld_exporter - Redis:
redis_exporter - RabbitMQ:
rabbitmq_prometheus_plugin
七、备份策略(不可忽视)
MySQL 备份
# 每日全备
sudo mysqldump --all-databases --single-transaction --routines --triggers > /backup/mysql_$(date +%F).sql
# 或使用 Percona XtraBackup 进行热备
Redis 备份
Redis 本身持久化机制(RDB/AOF)需启用:
save 900 1
save 300 10
save 60 10000
appendonly yes
定期复制 .rdb 文件到远程存储。
RabbitMQ 备份
RabbitMQ 没有原生热备工具,建议:
- 使用镜像队列(Mirrored Queues)实现高可用。
- 定期导出 vhost 和用户配置:
rabbitmqctl export_permissions > permissions.txt
八、总结与建议
- 网络隔离:始终将 MySQL 和 Redis 绑定到
127.0.0.1或内网 IP。 - 强密码:所有服务都设置强密码,禁用默认账户。
- 资源隔离:合理分配内存,避免 OOM 导致雪崩。
- 监控告警:部署监控系统,及时发现异常。
- 备份验证:定期测试恢复流程,确保备份有效。
通过以上步骤,你可以在一台 CentOS 或 Ubuntu 服务器上安全、稳定地共存运行 MySQL、Redis 和 RabbitMQ,满足大多数中小型互联网应用的需求。对于更大规模场景,建议拆分服务器或使用 Kubernetes 容器化部署。
云技术博客