在轻量应用服务器(如腾讯云轻量、阿里云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 - ❌ 使用空密码、弱密码(如
123456、password) - ❌ 以
root用户运行数据库进程 - ❌ 在应用代码中硬编码数据库密码(应使用环境变量或密钥管理)
- ❌ 关闭
protected-mode或skip-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 ping → NOAUTH 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 版本、云厂商、应用类型),我可为您定制完整部署脚本 👇
云服务器