在 CentOS 或 Ubuntu 服务器上同时部署 MySQL、Redis 和 RabbitMQ,核心挑战不在于“能不能装”,而在于资源隔离、端口冲突管理、安全加固以及生命周期维护。
很多新手直接 apt-get install 一通乱按,结果导致内存溢出(OOM)、权限混乱或者被黑客扫出漏洞。作为运维老手,我给你一套经过生产环境验证的“最小化、最安全”共存方案。
一、 核心原则:不要混用源,严格区分角色
- MySQL:关系型数据库,吃 CPU 和 IO,对稳定性要求极高。
- Redis:内存型数据库,吃内存,对延迟敏感。
- 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,这是高危项。
- 绑定地址:
编辑/etc/redis/redis.conf:bind 127.0.0.1 ::1 protected-mode yes port 6379 - 设置密码:
requirepass YourStrongRedisPassword123! - 重命名危险命令(可选但推荐):
rename-command FLUSHALL "" rename-command CONFIG "" rename-command SHUTDOWN "" - 创建独立用户:
不要以 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)
五、 监控与日志集中化
不要等到服务挂了才知道。
- 安装 Prometheus + Node Exporter:监控服务器整体资源。
- 各服务自带 Exporter:
- MySQL:
mysqld_exporter - Redis:
redis_exporter - RabbitMQ:
rabbitmq_prometheus_plugin
- MySQL:
- 日志轮转:
确保/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