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

在 CentOS 或 Ubuntu 服务器上同时部署 MySQL、Redis 和 RabbitMQ,核心挑战不在于“能不能装”,而在于资源隔离、端口冲突管理、安全加固以及生命周期维护。

很多新手直接 apt-get install 一通乱按,结果导致内存溢出(OOM)、权限混乱或者被黑客扫出漏洞。作为运维老手,我给你一套经过生产环境验证的“最小化、最安全”共存方案。


一、 核心原则:不要混用源,严格区分角色

  1. MySQL:关系型数据库,吃 CPU 和 IO,对稳定性要求极高。
  2. Redis:内存型数据库,吃内存,对延迟敏感。
  3. RabbitMQ:消息队列,基于 Erlang,吃内存和文件描述符。

切记: 除非是开发测试机,否则生产环境建议通过 Docker Compose 或 Kubernetes 进行容器化隔离。如果必须物理机/虚拟机原生安装,请遵循以下步骤。


二、 通用前置准备(CentOS & Ubuntu 均适用)

1. 系统基础优化

  • 关闭 Swap:Redis 对 Swap 极其敏感,Swap 会导致性能断崖式下跌。

    sudo swapoff -a
    # 永久禁用需注释 /etc/fstab 中的 swap 行
  • 调整文件描述符限制:RabbitMQ 和 MySQL 在高并发下会迅速消耗 FD。
    编辑 /etc/security/limits.conf,添加:

    * soft nofile 65536
    * hard nofile 65536
    mysql soft nofile 65536
    rabbitmq soft nofile 65536
    redis soft nofile 65536

    并修改 /etc/pam.d/common-session 确保配置生效。

  • 防火墙策略:只开放必要端口,且仅限内网 IP 访问。

    • MySQL: 3306 (仅内网)
    • Redis: 6379 (仅内网,严禁暴露公网!)
    • RabbitMQ: 5672 (AMQP), 15672 (Management UI, 仅内网)

三、 分步安装与安全配置

1. MySQL:稳字当头

Ubuntu:

sudo apt update
sudo apt install mysql-server
sudo systemctl enable mysql
sudo systemctl start mysql

CentOS 8+ (使用 AppStream):

sudo dnf module install mariadb-server mariadb  # CentOS 8+ 默认推荐 MariaDB,兼容 MySQL
# 或者下载 Oracle 官方 Repo 安装 MySQL 8.0
sudo systemctl enable mysqld
sudo systemctl start mysqld

安全加固(关键):
运行 sudo mysql_secure_installation,执行以下操作:

  • 设置 Root 密码(强密码)。
  • 移除匿名账户。
  • 禁止 Root 远程登录(Disallow root login remotely? Y)。
  • 移除 test 数据库。

配置文件 /etc/mysql/my.cnf 或 /etc/my.cnf.d/server.cnf 调优:

  • 设置 bind-address = 127.0.0.1 或内网 IP。
  • 根据服务器内存调整 innodb_buffer_pool_size(通常为物理内存的 50%-70%)。

2. Redis:内存杀手,必须隔离

Ubuntu/CentOS:

# Ubuntu
sudo apt install redis-server

# CentOS
sudo yum install epel-release
sudo yum install redis

安全加固(重中之重):
Redis 默认无密码且绑定 0.0.0.0,这是高危项。

  1. 绑定地址:
    编辑 /etc/redis/redis.conf:

    bind 127.0.0.1 ::1
    protected-mode yes
    port 6379
  2. 设置密码:
    requirepass YourStrongRedisPassword123!
  3. 重命名危险命令(可选但推荐):
    rename-command FLUSHALL ""
    rename-command CONFIG ""
    rename-command SHUTDOWN ""
  4. 创建独立用户:
    不要以 root 运行 Redis。确保 redis.conf 中 daemonize yes 且 user redis 拥有相应权限。

3. RabbitMQ:Erlang 的复杂性

Ubuntu:

sudo apt install rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server

CentOS:

# 需要先安装 EPEL 和 Erlang 依赖
sudo yum install erlang
sudo yum install rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server

启用管理插件与用户管理:

# 启用 Web 管理界面
sudo rabbitmq-plugins enable rabbitmq_management

# 创建一个应用专用用户(不要直接用 guest)
sudo rabbitmqctl add_user myapp_user MyStrongPassword123!
sudo rabbitmqctl set_permissions -p / myapp_user ".*" ".*" ".*"
sudo rabbitmqctl set_user_tags myapp_user administrator

安全加固:

  • 修改 /etc/rabbitmq/rabbitmq.conf,确保 listeners.tcp.default = 5672。
  • 同样绑定 127.0.0.1 或内网 IP。
  • 如果启用了 Management UI,务必通过 Nginx 反向X_X并加上 HTTPS 和基本认证,不要直接暴露在公网。

四、 共存时的资源竞争解决方案

在同一台服务器上,这三个服务会争夺 CPU、内存和磁盘 IO。如果不加限制,一个服务抖动会导致其他服务崩溃。

1. 内存控制(Cgroups v2)

现代 Linux 内核支持 Cgroups v2。你可以为每个服务分配最大内存上限,防止 OOM。

例如,限制 Redis 最多使用 2GB 内存:

# 假设 systemd 单元文件路径
sudo systemctl edit redis.service

在 [Service] 段添加:

MemoryMax=2G

重启服务:sudo systemctl restart redis

对 MySQL 和 RabbitMQ 做类似操作。

2. CPU 隔离

如果服务器核心数多(如 8C+),可以使用 systemd 的 CPUQuota 限制单个服务的 CPU 使用率。

[Service]
CPUQuota=50%

3. 磁盘 IO 优先级

使用 ionice 降低非关键任务的 IO 优先级,确保 MySQL 的写入优先。
在 systemd 服务文件中:

IOSchedulingClass=idle

或者手动启动时:

sudo ionice -c 3 -p $(pgrep mysqld)

五、 监控与日志集中化

不要等到服务挂了才知道。

  1. 安装 Prometheus + Node Exporter:监控服务器整体资源。
  2. 各服务自带 Exporter:
    • MySQL: mysqld_exporter
    • Redis: redis_exporter
    • RabbitMQ: rabbitmq_prometheus_plugin
  3. 日志轮转:
    确保 /etc/logrotate.d/ 中有这三个服务的日志切割配置,防止磁盘写满。

六、 终极建议:为什么我依然推荐 Docker?

虽然你问的是“如何安装”,但我必须指出:在生产环境中,原生安装 MySQL/Redis/RabbitMQ 的维护成本极高。

  • 版本锁定困难:升级 MySQL 大版本需要停机迁移数据。
  • 依赖地狱:RabbitMQ 依赖特定版本的 Erlang,升级系统库可能导致 MQ 崩溃。
  • 环境不一致:开发、测试、生产环境难以统一。

更优解:Docker Compose

创建一个 docker-compose.yml,利用 Docker 的网络隔离和资源限制(deploy.resources.limits),可以轻松实现上述所有安全目标,且随时可销毁重建。

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
    deploy:
      resources:
        limits:
          memory: 2G
    networks:
      - backend

  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD} --bind 127.0.0.1
    volumes:
      - redis_data:/data
    deploy:
      resources:
        limits:
          memory: 1G
    networks:
      - backend

  rabbitmq:
    image: rabbitmq:3-management
    environment:
      RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
      RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS}
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    deploy:
      resources:
        limits:
          memory: 1G
    networks:
      - backend

networks:
  backend:
    driver: bridge

volumes:
  mysql_data:
  redis_data:
  rabbitmq_data:

总结:
如果必须原生安装,请严格遵守最小权限原则、网络隔离和资源限制。但如果条件允许,请使用容器化方案,它将为你解决 80% 的安全和维护问题。

未经允许不得转载:云知道CLOUD » 如何在CentOS或Ubuntu服务器上安全地共存安装MySQL、Redis和RabbitMQ?