奋斗
努力

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

云计算

在轻量应用服务器(如腾讯云轻量、阿里云SAE轻量版、AWS Lightsail 等,通常为 1~2 核 / 2~4GB 内存)上安全地配置 MySQL 和 Redis 共存,需兼顾资源约束、安全隔离、最小权限原则和运维可维护性。以下是经过生产验证的分步最佳实践:


✅ 一、前置评估与规划(关键!)

项目 建议值 说明
内存分配 MySQL: ≥1.2GB,Redis: ≤512MB(总内存≥2GB) Redis 使用 maxmemory 512mb + maxmemory-policy allkeys-lru;MySQL 配置 innodb_buffer_pool_size=1024M(占物理内存 50%~60%)
磁盘类型 SSD(必选) 避免机械盘导致 I/O 瓶颈,尤其 Redis RDB/AOF 和 MySQL redo log 写入频繁
系统版本 Ubuntu 22.04 LTS / CentOS Stream 9 长期支持、软件源稳定、安全更新及时

⚠️ 若服务器仅 1GB 内存 → 不建议共存,优先选 Redis(内存数据库)或 MySQL(持久化核心),或改用云托管服务(如腾讯云 TCM、阿里云 ApsaraDB)。


✅ 二、安全安装与基础加固

1. 使用包管理器安装(避免二进制手动部署)

# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server redis-server -y

# 安装后立即禁用默认服务(防止未配置即启动)
sudo systemctl stop mysql redis-server
sudo systemctl disable mysql redis-server

2. 创建专用系统用户(非 root 运行)

sudo adduser --system --group --no-create-home --shell /usr/sbin/nologin mysql
sudo adduser --system --group --no-create-home --shell /usr/sbin/nologin redis

✅ 后续配置文件中指定 user = mysql / user = redis,杜绝 root 权限运行。


✅ 三、MySQL 安全配置(/etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
# 基础安全
skip-networking = OFF          # 允许本地连接(但限制绑定地址)
bind-address = 127.0.0.1       # ❗仅监听本地回环,禁止公网暴露
port = 3306
socket = /var/run/mysqld/mysqld.sock

# 资源与性能(适配轻量机)
innodb_buffer_pool_size = 1024M
max_connections = 50           # 防止连接耗尽内存
table_open_cache = 400
tmp_table_size = 32M
max_heap_table_size = 32M

# 安全强化
default_authentication_plugin = mysql_native_password
secure_file_priv = "/var/lib/mysql-files/"  # 限制 LOAD DATA INFILE 路径
local_infile = OFF              # 禁用危险命令
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

# 日志(可选但推荐)
log_error = /var/log/mysql/error.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

🔐 初始化安全设置(首次运行)

sudo mysql_secure_installation
# 操作:设 root 密码 → 删除匿名用户 → 禁用远程 root → 删除 test 库 → 刷新权限

🧩 创建应用专用账号(最小权限)

-- 登录 MySQL
sudo mysql -u root -p

-- 创建应用数据库与用户(替换 your_db_name / your_app_user / strong_password)
CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'your_app_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON your_db_name.* TO 'your_app_user'@'localhost';
FLUSH PRIVILEGES;

✅ 永远不用 root@localhost 连接应用!应用配置中只使用 your_app_user


✅ 四、Redis 安全配置(/etc/redis/redis.conf

# 基础安全
bind 127.0.0.1 ::1        # 仅本地 IPv4/v6,禁用 0.0.0.0
protected-mode yes        # 开启保护模式(默认已开)
port 6379
tcp-backlog 511

# 认证(必须启用!)
requirepass your_strong_redis_password   # ❗强密码(20位+,含大小写数字符号)

# 资源限制(防内存爆炸)
maxmemory 512mb
maxmemory-policy allkeys-lru
maxmemory-samples 5

# 持久化(轻量机建议关闭 RDB/AOF,或仅 RDB)
save ""                    # ❌ 关闭自动 RDB(避免 fork 卡顿)
# 或保留:save 900 1      # 15分钟内1次修改才保存(低频业务可选)
appendonly no              # ❌ 关闭 AOF(高写入场景慎开,会显著增加 I/O)

# 其他加固
dir /var/lib/redis         # 数据目录权限将设为 redis:redis
dbfilename dump.rdb
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 700

# 禁用高危命令(可选但强烈推荐)
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

🔐 设置目录权限

sudo chown -R redis:redis /var/lib/redis /var/log/redis
sudo chmod 755 /var/lib/redis
sudo chmod 644 /etc/redis/redis.conf

✅ 五、服务管理与启动(确保独立、安全)

# 修改 systemd 服务文件,强制指定用户
sudo systemctl edit redis-server
# 添加:
[Service]
User=redis
Group=redis
Restart=always
RestartSec=10

sudo systemctl edit mysql
[Service]
User=mysql
Group=mysql
Restart=always
RestartSec=10

# 启用并启动(按顺序:先 MySQL 后 Redis)
sudo systemctl enable mysql
sudo systemctl enable redis-server
sudo systemctl start mysql
sudo systemctl start redis-server

# 验证状态
sudo systemctl status mysql redis-server
sudo ss -tlnp | grep -E ':(3306|6379)'

✅ 六、防火墙与网络加固(关键!)

# Ubuntu UFW(默认未启用)
sudo ufw enable
sudo ufw default deny incoming
sudo ufw allow OpenSSH
# ❌ 不开放 3306 / 6379 端口!应用通过 localhost 连接即可
# 如需远程管理(不推荐),仅限可信 IP:
# sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp

✅ 所有应用(PHP/Node.js/Python)连接 MySQL/Redis 时,host 必须为 127.0.0.1(非 localhost,避免 Unix socket 与 TCP 混淆),端口明确指定。


✅ 七、监控与告警(轻量级方案)

# 安装基础监控(内存/CPU/服务状态)
sudo apt install htop iotop sysstat -y
sudo systemctl enable sysstat

# 检查 MySQL/Redis 是否存活(加入 cron 每5分钟)
echo '*/5 * * * * /usr/bin/pgrep mysqld >/dev/null || /usr/bin/systemctl restart mysql' | sudo tee -a /var/spool/cron/crontabs/root
echo '*/5 * * * * /usr/bin/pgrep redis-server >/dev/null || /usr/bin/systemctl restart redis-server' | sudo tee -a /var/spool/cron/crontabs/root

✅ 八、备份策略(轻量机必备)

组件 方案 频率 存储位置
MySQL mysqldump + gzip 每日 2:00 /backup/mysql/(挂载对象存储或异地同步)
Redis redis-cli BGSAVE + RDB 备份 每日 3:00 /backup/redis/(同上)
# 示例 MySQL 备份脚本 /opt/scripts/backup-mysql.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u your_app_user -p'your_password' --single-transaction your_db_name | gzip > /backup/mysql/backup_$DATE.sql.gz
find /backup/mysql/ -name "*.sql.gz" -mtime +7 -delete

🚫 绝对禁止事项(安全红线)

  • ❌ 将 MySQL/Redis 绑定到 0.0.0.0 或公网 IP
  • ❌ 使用空密码、弱密码(如 123456password
  • ❌ 以 root 用户运行数据库进程
  • ❌ 在应用代码中硬编码数据库密码(应使用环境变量或密钥管理)
  • ❌ 关闭 protected-modeskip-networking 后不设密码
  • ❌ 在轻量机上启用 MySQL 的 skip-grant-tables(调试后未恢复)

✅ 最终验证清单

检查项 命令/方法 预期结果
MySQL 仅本地监听 sudo ss -tlnp | grep :3306 127.0.0.1:3306
Redis 仅本地监听 sudo ss -tlnp | grep :6379 127.0.0.1:6379
MySQL 应用用户权限 mysql -u your_app_user -p -e "SHOW GRANTS;" 仅显示 your_db_name.* 权限
Redis 密码生效 redis-cli pingNOAUTH Authentication required. auth your_password 才能响应 PONG
服务以非 root 运行 ps aux | grep -E "(mysql|redis)" USER 列为 mysql / redis

如需进一步自动化,可提供:

  • ✅ 一键安全初始化脚本(Bash)
  • ✅ Docker Compose 轻量部署方案(隔离更好,但内存开销略增)
  • ✅ Nginx + PHP-FPM + MySQL + Redis 全栈轻量模板

欢迎告知您的具体环境(OS 版本、云厂商、应用类型),我可为您定制完整部署脚本 👇

未经允许不得转载:云服务器 » 在轻量应用服务器上如何安全配置MySQL和Redis共存?