在轻量应用服务器上如何安全配置MySQL和Redis共存?

在轻量应用服务器(如腾讯云轻量、阿里云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 requiredPONG
✅ 用户权限最小化 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.0protected-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云枢 » 在轻量应用服务器上如何安全配置MySQL和Redis共存?