在轻量应用服务器(如腾讯云轻量、阿里云SAE轻量版、AWS Lightsail等,通常为1~2核2~4GB内存)上安全地配置 MySQL 和 Redis 共存,需兼顾资源约束、安全隔离、最小权限原则和基础防护。以下是经过生产验证的分步实践指南:
✅ 一、前提评估与规划(关键!)
| 项目 | 建议值 | 说明 |
|---|---|---|
| 内存 | ≥3GB(推荐4GB) | MySQL(InnoDB buffer pool)+ Redis(maxmemory)需预留至少 1.5GB 给系统/其他进程 |
| 磁盘 | SSD,≥50GB | 避免日志/数据写满导致服务崩溃;建议 /var/lib/mysql 和 /var/lib/redis 分区或挂载独立目录 |
| OS | Ubuntu 22.04 LTS / CentOS Stream 9 | 长期支持、安全更新及时 |
⚠️ 若仅2GB内存:不建议共存——优先选 Redis(缓存)+ 云数据库MySQL(如腾讯云CVM MySQL版),更安全稳定。
✅ 二、安全安装与初始化(以 Ubuntu 22.04 为例)
1. 使用包管理器安装(避免源码编译增加攻击面)
# 更新 & 安装
sudo apt update
sudo apt install -y mysql-server redis-server
# 启动并设开机自启
sudo systemctl enable mysql redis-server
sudo systemctl start mysql redis-server
2. 立即加固 MySQL(关键步骤)
sudo mysql_secure_installation
- ✅ 设置 root 密码(强密码,12位+大小写字母+数字+符号)
- ✅ 移除匿名用户(Y)
- ✅ 禁止 root 远程登录(Y)→ 仅
localhost可访问 - ✅ 删除 test 数据库(Y)
- ✅ 重载权限表(Y)
3. 创建应用专用数据库与用户(最小权限)
-- 登录 MySQL(仅本地)
sudo mysql -u root -p
-- 创建数据库(UTF8MB4 支持 emoji)
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建专用用户(仅限 localhost,禁止 %)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPass!2024';
-- 授予最小必要权限(不给 DROP/CREATE/GRANT)
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'myapp_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
EXIT;
4. 加固 Redis(默认不安全!必须修改)
编辑配置文件:
sudo nano /etc/redis/redis.conf
✅ 强制修改以下项:
# 1. 绑定本地回环(禁止网络监听)
bind 127.0.0.1 ::1
# 2. 关闭保护模式(因已绑定本地,且需明确关闭)
protected-mode yes → 改为 protected-mode no # ⚠️ 注意:仅在 bind 127.0.0.1 时安全!
# 3. 设置密码(必须!)
requirepass YourRedisStrongPassword!2024
# 4. 禁用危险命令(可选但推荐)
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
# 5. 设置内存上限(防OOM)
maxmemory 512mb
maxmemory-policy allkeys-lru # 内存满时LRU淘汰
# 6. 开启 AOF 持久化(比 RDB 更安全)
appendonly yes
appendfilename "appendonly.aof"
重启 Redis:
sudo systemctl restart redis-server
验证密码是否生效:
redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> AUTH YourRedisStrongPassword!2024
OK
✅ 三、资源限制(防服务争抢崩溃)
1. 为 MySQL 限制内存(避免吃光内存)
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
# 根据总内存调整(示例:4GB机器 → 设为 1G)
innodb_buffer_pool_size = 1G
key_buffer_size = 32M
max_connections = 50
tmp_table_size = 32M
max_heap_table_size = 32M
2. 为 Redis 限制内存(已在 redis.conf 中配置 maxmemory 512mb)
3. (可选)使用 systemd 限制进程内存(双重保险)
# 为 MySQL 限制
sudo systemctl edit mysql
添加:
[Service]
MemoryLimit=1.2G
# 为 Redis 限制
sudo systemctl edit redis-server
添加:
[Service]
MemoryLimit=600M
sudo systemctl daemon-reload
sudo systemctl restart mysql redis-server
✅ 四、网络与防火墙加固
1. 使用 UFW 仅放行必要端口
sudo ufw enable
sudo ufw default deny incoming # 默认拒绝入站
# 仅允许 SSH(必须)
sudo ufw allow OpenSSH
# ❌ 禁止开放 MySQL(3306) 和 Redis(6379) 到公网!
# ✅ 如果 Web 应用在同一台服务器,无需开放端口(应用直连 127.0.0.1)
# 验证
sudo ufw status verbose
🔐 原则:MySQL/Redis 仅监听 127.0.0.1,应用通过 localhost 访问,不暴露任何端口到公网。
2. 检查监听状态(确认无公网暴露)
sudo ss -tuln | grep -E ':3306|:6379'
# ✅ 正确输出应为:127.0.0.1:3306 和 127.0.0.1:6379
# ❌ 若出现 *:3306 或 0.0.0.0:6379 → 立即检查配置并重启服务!
✅ 五、安全运维建议
| 类别 | 措施 | 工具/命令 |
|---|---|---|
| 自动备份 | 每日 MySQL 备份 + 压缩加密;Redis AOF 已开启 | mysqldump --single-transaction -u myapp_user -p... | gzip > backup_$(date +%F).sql.gz |
| 日志审计 | 启用 MySQL 慢查询日志、错误日志;Redis 日志级别设为 notice |
slow_query_log = ON, loglevel notice |
| 定期更新 | 每月 apt update && apt upgrade |
sudo unattended-upgrades(启用自动安全更新) |
| 入侵检测 | 监控异常连接、高频失败登录 | grep "Access denied" /var/log/mysql/error.log | tail -20 |
| 应用连接方式 | 应用代码中使用 127.0.0.1(非 localhost,避免 socket 误配) |
PHP: $pdo = new PDO("mysql:host=127.0.0.1;dbname=myapp", ...) |
✅ 六、验证清单(部署后必做)
| 检查项 | 命令/方法 | 预期结果 |
|---|---|---|
| ✅ MySQL 仅本地监听 | sudo ss -tln | grep :3306 |
127.0.0.1:3306 |
| ✅ Redis 仅本地监听 + 密码 | redis-cli -h 127.0.0.1 ping → 应失败;加密码后成功 |
(error) NOAUTH Authentication required → PONG |
| ✅ 用户权限最小化 | mysql -u myapp_user -p -e "SHOW GRANTS;" |
仅含 myapp.* 权限,无 GRANT OPTION |
| ✅ 内存占用合理 | free -h + ps aux --sort=-%mem | head -10 |
MySQL+Redis 占用 < 2.5GB(4GB机器) |
| ✅ 防火墙阻断公网端口 | nmap -sT -p 3306,6379 your_server_ip |
3306/tcp filtered mysql, 6379/tcp filtered redis |
🚫 常见高危错误(务必避免)
- ❌ 使用
bind 0.0.0.0或protected-mode no且未设密码 → Redis 被X_X/勒索 - ❌ MySQL root 允许
%远程登录 + 弱密码 → 扫描器秒破 - ❌ 不限制
maxmemory→ Redis 写满内存触发 OOM Killer 杀死 MySQL - ❌ 将数据库密码硬编码在 Web 应用代码中 → Git 泄露风险
- ❌ 忽略
mysql_secure_installation→ 匿名用户可直接登录
💡 进阶建议(轻量场景可选)
- 使用 Docker Compose 隔离运行(更易管理,但增加约100MB内存开销)
- 将 MySQL 数据目录挂载到独立云硬盘(提升IO+便于快照备份)
- 用 Fail2ban 监控 MySQL/Redis 登录失败,自动封禁IP
- 对敏感业务,将 Redis 替换为 云托管 Redis(如腾讯云 CRS),专注业务逻辑
如按此方案配置,可在轻量服务器上实现 MySQL + Redis 安全、稳定、低干扰共存。核心口诀:
🔐 本地监听 + 强密码 + 最小权限 + 内存限制 + 防火墙兜底
需要我为你生成:
- ✅ 完整的
redis.conf/mysqld.cnf安全模板 - ✅ 自动化部署脚本(Bash)
- ✅ Docker Compose 版本
- ✅ Fail2ban 针对 MySQL/Redis 的 jail 配置
欢迎随时告知 👇
CLOUD云枢