努力
加油

如何在CentOS或Ubuntu服务器上安全地共存安装MySQL、Redis和RabbitMQ?

在 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:

  1. 绑定地址:

    bind 127.0.0.1 ::1
    protected-mode yes
  2. 设置密码(取消注释并修改):

    requirepass your_strong_password_here
  3. 重命名危险命令(可选但推荐):

    rename-command FLUSHALL ""
    rename-command CONFIG ""
    rename-command SHUTDOWN ""
  4. 重启 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

八、总结与建议

  1. 网络隔离:始终将 MySQL 和 Redis 绑定到 127.0.0.1 或内网 IP。
  2. 强密码:所有服务都设置强密码,禁用默认账户。
  3. 资源隔离:合理分配内存,避免 OOM 导致雪崩。
  4. 监控告警:部署监控系统,及时发现异常。
  5. 备份验证:定期测试恢复流程,确保备份有效。

通过以上步骤,你可以在一台 CentOS 或 Ubuntu 服务器上安全、稳定地共存运行 MySQL、Redis 和 RabbitMQ,满足大多数中小型互联网应用的需求。对于更大规模场景,建议拆分服务器或使用 Kubernetes 容器化部署。